PowerShell: Compilerfunktionen

2. Dezember 2014 16:29

Diese Funktionen können ab NAV 2013 in der Powershell genutzt werden, um Objekte in einer Datenbank (ggf. unter Angabe eines Filters, im Beispiel wird auf *OPP* in der Versionsliste gefiltert) über den Befehl CompileObjects der finsql.exe zu kompilieren. Ab NAV 2015 wird dafür auch ein Cmdlet Compile-NAVApplicationObject geliefert, das derzeit aber nur für NAV 2015-Datenbanken genutzt werden kann.

Wie diese Funktionen in einer Stapelverarbeitung eingesetzt werden können, ist hier beschrieben.

Für NAV 2013
Code:
 function CompileNAV70
    {
     [CmdletBinding()]param (
     [String]$WorkingFolder,
     [String]$Server,
     [String]$Database,
     [String]$Filter
    )

     $LogFile = "$WorkingFolder\$Server\$Database\navcommandresult.txt"
     if (Test-Path "$LogFile\navcommandresult.txt") {Remove-Item "$LogFile\navcommandresult.txt"}
 
     $NAVFolder = '"C:\Program Files (x86)\Microsoft Dynamics NAV\70\RoleTailored Client'
     $compilefinsqlcommand = """$NAVFolder\finsql.exe"" command=compileobjects,servername=$Server,database=$Database,logfile=$LogFile"
     if ($Filter -ne ""){$compilefinsqlcommand = "$compilefinsqlcommand,filter=$Filter"}
     $Command = $compilefinsqlcommand
     Write-Debug $Command
     cmd /c $Command
    }

Für NAV 2013 R2
Code:
   function CompileNAV71
    {
     [CmdletBinding()]param (
     [String]$WorkingFolder,
     [String]$Server,
     [String]$Database,
     [String]$Filter
    )

     $LogFile = "$WorkingFolder\$Server\$Database\navcommandresult.txt"
     if (Test-Path "$LogFile\navcommandresult.txt") {Remove-Item "$LogFile\navcommandresult.txt"}
 
     $NAVFolder = '"C:\Program Files (x86)\Microsoft Dynamics NAV\71\RoleTailored Client'
     $compilefinsqlcommand = """$NAVFolder\finsql.exe"" command=compileobjects,servername=$Server,database=$Database,logfile=$LogFile"
     if ($Filter -ne ""){$compilefinsqlcommand = "$compilefinsqlcommand,filter=$Filter"}
     $Command = $compilefinsqlcommand
     Write-Debug $Command
     cmd /c $Command
    }



Damit man bei mehreren Datenbanken nicht den Überblick verliert, wo ggf. Fehler auftraten, werden die navcommandresult.txt und eventuelle Fehlerdateien dabei in einem Pfad abgelegt, der aus Server- und Datenbanknamen gebildet wird.
Exportdatei.png

Eingabebeispiel
CompilerBeispielParameter.png

Eingabevorlage (hier für NAV 2013 R2)
Code:
CompileNAV71 `
 -WorkingFolder '<MyLogFilePath>' `
 -Server '<MyServerName>' `
 -Database '<MyDatabaseName>' `
 -Filter 'Version List="<MyFilter>"'


Für NAV 2015 kann die Funktion natürlich auch angepasst werden, da kommt ein zusätzlicher Parameter für synchronizeschemachanges dazu (Yes/No/Force, das entspricht den Optionen Now-with validation/Later/Force beim manuellen Kompilieren). Dieser darf bei den NAV 2013-Clients nicht verwendet werden, da er in diesen Versionen noch unbekannt ist und sofort zum Abbruch führt.

NAV2015CompilerBeispielParameter.png


Eingabevorlage NAV 2015
Code:
CompileNAV80 `
 -WorkingFolder '<MyLogFilePath>' `
 -Server '<MyServerName>' `
 -Database '<MyDatabaseName>' `
 -Filter 'Version List="<MyFilter>"' `
 -Synchronize 'No'


Code:
  function CompileNAV80
    {
     [CmdletBinding()]param (
     [String]$WorkingFolder,
     [String]$Server,
     [String]$Database,
     [String]$Filter,
    [String]$Synchronize
    )


      $LogFile = "$WorkingFolder\$Server\$Database\navcommandresult.txt"
   
     if (Test-Path "$LogFile\navcommandresult.txt") {Remove-Item "$LogFile\navcommandresult.txt"}
 
     $NAVFolder = '"C:\Program Files (x86)\Microsoft Dynamics NAV\80\RoleTailored Client'
     $compilefinsqlcommand = """$NAVFolder\finsql.exe"" command=compileobjects,servername=$Server,database=$Database,logfile=$LogFile,synchronizeschemachanges=$Synchronize"
     if ($Filter -ne ""){$compilefinsqlcommand = "$compilefinsqlcommand,filter=$Filter"}
     $Command = $compilefinsqlcommand
     Write-Debug $Command
     cmd /c $Command
    }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.