PowerShell: Einsatz der NAVApplicationObjectLanguage-Cmdlets

5. Dezember 2014 13:17

Mit NAV 2015 sind Cmdlets erschienen, die das Löschen nach dem Objektimport und Zufügen der entfernten Sprachen vor dem Objektimport ermöglichen. Das ist in der Entwicklungsphase auch notwendig, denn ab NAV 2015 kann man keine Sprachlayer mehr ohne Instanz importieren, was bis NAV 2013 R2 noch möglich war.
Das bislang mögliche Verfahren, die Sprachlayer durch Export in eine flm-Datei inklusive Löschen zu entfernen und erst dann den Objektexport vorzunehmen, ist also nur noch bedingt einsetzbar.

Bei internationalem Einsatz ist hier auch zu beachten, dass bei Objekten, in denen der C/AL-Code in Westeuropa verwendete Sonderzeichen enthält, aus diesen dann Fragezeichen werden, wenn diese Datei auf einem System mit anderer Codepage als 850 für Westeuropa (wie in CZ,PL usw. mit Codepage 852) weiterverarbeitet wird, wo diese Sonderzeichen nicht in der örtlichen Codepage enthalten sind.

Verwendbar sind diese Cmdlets ab NAV 2013-Objekten.

Ein einfaches Anwendungsbeispiel für ein Objekt (in der Realität wäre das das erste aus einem Objektpaket von 61):
Aus der/n exportierten Objektdatei(en) (hier für Report 29) wird per Cmdlet Remove-NAVApplicationObjectLanguage die Sprachlayer (hier DES,FRS,ITS aus einer CH-Datenbank) entfernt und in einer neuen Datei gespeichert.
Die weiteren Parameter, die das Cmdlet anbietet, sind nicht notwendig, wenn alle Layer entfernt werden sollen und nur die ENU-Sprachschicht übrigbleiben soll. Das ist Voraussetzung dafür, dass beim anschließenden Dateivergleich nur die reellen Unterschiede übrigbleiben und ggf. auch das automatische Mergen hierauf dann reibungslos ansetzen kann.
LangLayerBild1.png

Im Vergleich sieht das dann so aus:
LangLayerBild2.png

Aus dem CH-Datenbank werden die Captions exportiert, per Extras>Translate>Export, also in eine .txt, nicht in eine .flm. Hier im Beispiel eine Komplettdatei für alle Objekte, wenn man weiß, welche Objekte betroffen sind, kann man die vorher über gezielte Markierung der Objekte filtern.
LangLayerBild3.png

Aus der anderen Datenbank, hier eine DE-Datenbank mit Add-On OPplus, wird aus den Objekten ebenfalls die Sprachlayer (hier DEU) mit Remove-NAVApplicationObjectLanguage entfernt…
LangLayerBild4.png

…und der Code gemergt und (ggf. in eine neue Datei) gespeichert. Ab dieser Stufe kann man dafür natürlich auch die Merge-Cmdlets einsetzen.
LangLayerBild5.png

In die gemergten Datei werden nun per Cmdlet Import-NAVApplicationObjectLanguage die DES/FRS/ITS-Sprachlayer der CH-Version wieder zugefügt.
LangLayerBild6.png

Wenn die Sprachdatei mehr Objekteinträge enthält als für den aktuellen Import in die Objekte benötigt werden, kommen Warnungen, die man aber ignorieren kann.
LangLayerBild7.png

Das Ergebnis ist eine Objektdatei, die den Add-On-Code und die CH-Sprachlayer enthält und so in die CH-Datenbank importiert werden kann.
LangLayerBild8.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Einsatz der NAVApplicationObjectLanguage-Cmdlets

11. Dezember 2014 09:56

In NAV 2015 Cumulative Update 2 sind ja Updates für diverse Bugs in den Cmdlets erschienen, da war auch einer für Import-NAVApplicationObjectLanguage dabei, der sonst zu einer Fehlermeldung
Element Page does not support property Unknown

führen kann. Also austauschen, wenn man nicht auf Update 2 wechseln kann, den Import-Module Befehl in der Profildatei für die Microsoft.Dynamics.Nav.Model.Tools.psd1 samt Anhang statt aus dem Programmverzeichnis ggf. aus einem anderen Ordner durchführen.

Objektgruppierung wird verändert

16. Januar 2015 11:00

Bei Objektpaketen wird die Objektgruppierung beim Entfernen der Sprachlayer gegenüber dem Clientexportverhalten verändert (im Bild rechts, Tabellen kommen statt am Anfang dann zwischen Codeunits und Pages).
ObjektGruppierungLanguageCmdlet.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Einsatz der NAVApplicationObjectLanguage-Cmdlets

20. Januar 2015 14:24

Beim Einsatz dieser Tools für den automatischen Merge sollte man darauf achten, dass bei allen beteiligten Objekten nur die ENU-Layer übrigbleibt.

Ein Szenario:
ORIGINAL: mit DEU und ENU (DE-Grundlage für die MODIFIED-Version)
MODIFIED: nur ENU (hier z.B. die um DEU-„gekappte“ AddOn-Version)
TARGET: nur ENU (W1)
führt zwar nicht zum ungewollten Hinzufügen der DEU-Layer im RESULT und funktioniert auch zu 99,9 %, es kommt aber zu unnötigen Konflikten in veränderten OptionCaptionML- und CaptionML-Zeilen und einzeilige Merges werden dann nicht automatisch verarbeitet. Ein Szenario, wo alle Ordner nur ENU-Objekte enthalten, übernimmt dagegen die richtigen (Option)CaptionML in den RESULT-Ordner. ohne Konflikte anzuzeigen.

Wenn das ORIGINAL-Objektpaket schon zerlegt vorhanden ist, muss man also zusätzliche Schritte ausführen. Also die Einzeldateien im ORIGINAL mit Join-Cmdlet zusammenfassen, dann in der entstandenen Datei die DEU-Layer entfernen und dann diese per Split-Cmdlet in den Ordner ORIGINAL schreiben. Vorher noch entweder alle alten Dateien im ORIGINAL löschen oder beim Splitten mit –force überschreiben.

Links das Mergeverhalten mit DEU-Layer im ORIGINAL, links das richtige Ergebnis direkt vom Merge-Cmdlet ohne DEU-Layer.
OptionCaptionML.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Sprachlayerentfernung mit Clientexport-Objektgruppierung

26. Juli 2015 12:49

Da die oben erwähnte Umstellung der Objektgruppierung den direkten Vergleich eines Objektpakets fast immer unmöglich macht,
habe ich hier ein Skript erstellt, welches die Datei zerlegt, dann die Sprachen entfernt und wieder in der richtigen Objektgruppierung (Tabellen zuerst usw.) zusammensetzt.

Die Funktion wird zusammen mit dem vollständigen Pfad der Quelldatei aufgerufen (dazu Umschalt + rechte Maustaste drücken, dann im Kontektmenü "Als Pfad kopieren" wählen).
Die ENU-Datei ohne Sprachlayer wird dabei im gleichen Pfad abgelegt wie die Quelldatei.

Zur Laufzeit werden im temporären Pfad des Benutzers (C:\Users\<USERNAME>\AppData\Local\Temp) zwei Ordner mit den Einzeldateien angelegt, die am Schluss wieder gelöscht werden.
Falls man diese oder die einzelen Dateien bis zum nächsten Lauf des Skripts behalten möchte, kann man die unteren Zeilen mit Remove-Item jeweils mit # auskommentieren.

Wenn man nicht alle Sprachen entfernen möchte, muss nur die Zeile mit Remove-NAVApplicationObjectLanguage mit den weiteren Parametern wie -LanguageId, die zu diesem Cmdlet gehören (und der Funktionsname :wink: ) geändert werden.

RemoveAllLang6.jpg


Anzeige zur Laufzeit (außer dieser Ausgabe laufen bei den Split- und Join-Cmdlets natürlich noch zahlreiche Fortschrittsbalken über den Bildschirm :-) )
RemoveAllLang2.jpg

Mit den so erzeugten Dateien können die Lokalisationsanpassungen (auch bei unterschiedlicher Objektanzahl der Vergleichspakete) sofort eindeutig erkannt bzw. jeweils direkt angesprungen werden, ohne die Gefahr, dass diese dabei in den Captionunterschieden untergehen.
RemoveAllLang5.jpg

Code:
function RemoveAllLang
{
 $WorkingFolder1 = "$env:temp\NAVTEMPLANG1"
 $WorkingFolder2 = "$env:temp\NAVTEMPLANG2"
 
 $FullReadingPath = resolve-path $args
 $ParentReadingPath = (get-item $FullReadingPath).DirectoryName
 $ConvertedFileName = [System.IO.Path]::GetFileNameWithoutExtension($args) +"_ENU" + [System.IO.Path]::GetExtension($args)

 IF (Test-Path $WorkingFolder1) {Remove-Item $WorkingFolder1\*.txt -recurse}
 IF (Test-Path $WorkingFolder2) {Remove-Item $WorkingFolder2\*.txt -recurse}
 IF (Test-Path $FullReadingPath)
 {
    Split-NAVApplicationObjectFile -Source $FullReadingPath -Destination $WorkingFolder1 -Force
    Remove-NAVApplicationObjectLanguage -Destination $WorkingFolder1\TEMPLANG1.txt -Source $FullReadingPath -force
    Split-NAVApplicationObjectFile -Source $WorkingFolder1\TEMPLANG1.txt -Destination $WorkingFolder2 -Force
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\TAB*.txt -Destination $WorkingFolder2\alltables.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\REP*.txt -Destination $WorkingFolder2\allreports.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\COD*.txt -Destination $WorkingFolder2\allcodeunits.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\XML*.txt -Destination $WorkingFolder2\allXMLports.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\MEN*.txt -Destination $WorkingFolder2\allmenusuites.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\PAG*.txt -Destination $WorkingFolder2\allpages.txt
    Join-NAVApplicationObjectFile -Source $WorkingFolder2\QUE*.txt -Destination $WorkingFolder2\allqueries.txt
    Write-Host "Concatenating the separate object files into the AllObjects.txt, this may take a while. This file will be copied as $ParentReadingPath\$ConvertedFileName when finished."
    IF (Test-Path $WorkingFolder2\alltables.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\alltables.txt)}
    IF (Test-Path $WorkingFolder2\allreports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allreports.txt)}
    IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allcodeunits.txt)}
    IF (Test-Path $WorkingFolder2\allXMLports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allXMLports.txt)}
    IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allmenusuites.txt)}
    IF (Test-Path $WorkingFolder2\allpages.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allpages.txt)}
    IF (Test-Path $WorkingFolder2\allqueries.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allqueries.txt)}
    IF (Test-Path $WorkingFolder2\alltables.txt) {Remove-Item $WorkingFolder2\alltables.txt}
    IF (Test-Path $WorkingFolder2\allreports.txt) {Remove-Item $WorkingFolder2\allreports.txt}
    IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Remove-Item $WorkingFolder2\allcodeunits.txt}
    IF (Test-Path $WorkingFolder2\allXMLports.txt) {Remove-Item $WorkingFolder2\allXMLports.txt}
    IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Remove-Item $WorkingFolder2\allmenusuites.txt}
    IF (Test-Path $WorkingFolder2\allpages.txt) {Remove-Item $WorkingFolder2\allpages.txt}
    IF (Test-Path $WorkingFolder2\allqueries.txt) {Remove-Item $WorkingFolder2\allqueries.txt}
    IF (Test-Path $WorkingFolder2\allobjects.txt) {Copy-Item $WorkingFolder2\AllObjects.txt -destination "$ParentReadingPath\$ConvertedFileName" -force}
  }
  IF (Test-Path $WorkingFolder1) {Remove-Item $WorkingFolder1 -recurse}
  IF (Test-Path $WorkingFolder2) {Remove-Item $WorkingFolder2 -recurse}
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Sprachlayerimport mit fester Sprachvorlagendatei

27. August 2015 22:59

Wenn der Objektmerge im "ENU-only"-Objektpakets beendet ist, führt das Cmdlet Import-NAVApplicationObjectLanguage zwar die Captions wieder zu, aber verändert auch wie oben die Objektgruppierung. Ein Vergleich des Gesamtpakets gegenüber der ursprünglich aus dem Development Environment exportierten ist also ebenfalls nicht möglich.

Mit der Beispielfunktion wird das behoben, nach dem Import der Layer wird das Paket komplett zerlegt und in der richtigen Gruppierung wieder zusammengesetzt und mit dem Suffix "_CAP" im gleichen Ordner abgelegt.

Desweiteren habe ich die Funktion für eine feste Sprachlayerdatei ausgelegt, so dass diese als einzigen Parameter nur den Pfad zur Objektdatei benötigt. Die Translationsdatei muss dabei lediglich mit dem Namen LNG.txt im gleichen Ordner wie die Objektdatei liegen.

Da die Sprachlayer auch problemlos wesentlich mehr Objektreferenzen enthalten kann, als die Objektdatei Objekte enthält, kann man so mit einer festen Sprachvorlagendatei arbeiten, welche die maximal notwendigen Captions für die zu mergenden Objekte beinhaltet.
Diese muss also nicht geändert werden, egal ob das Paket viele oder wenig Objekte enthält, wichtig ist nur, dass in der Translationsdatei im Bezug auf die Objektpaketdatei nichts fehlt. Wenn die Translationsdatei Referenzen enthält, die im aktuellen Paket nicht zugeordnet werden können, kommen für die nicht verarbeitbaren Captions zwar vom Cmdlet viele Warnungen in gelb (siehe vorletztes Bild im ersten Beitrag (Link), dort so wie beim Lauf im ISE, in der Konsole kommen etwas andere Texte in den Warnmeldungen), diese können aber ignoriert werden, da alles andere trotzdem korrekt verabeitet wird.

ImpLangLayer1para.jpg

Code:
function ImportLangLayer1para
{
 [cmdletbinding()]
    param(
        [string]$ObjFile_ENU)
# Version with single parameter (object file) to save typing if the translations file LNG.txt in the same folder may be re-used with different object packs   
If ($ObjFile_ENU -eq '') {THROW 'Path of the object source file is missing.'}
$BasicPath = resolve-path $ObjFile_ENU
$FileParentPath = (get-item $ObjFile_ENU).parent.FullName
# Activate if required (Console)
# Import-Module "C:\Program Files (x86)\Microsoft Dynamics NAV\80\RoleTailored Client\NavModelTools.ps1" -force -DisableNameChecking | out-null
$ConvFilePath = [System.IO.Path]::GetDirectoryName($ObjFile_ENU) + "\"+ [System.IO.Path]::GetFileNameWithoutExtension($ObjFile_ENU) + "_CAP" + [System.IO.Path]::GetExtension($ObjFile_ENU)
if (Test-Path $ConvFilePath) {Remove-Item $ConvFilePath}
$WorkingFolder1 = "$env:temp\TEMPLANG1"
$WorkingFolder2 = "$env:temp\TEMPLANG2"
IF (!(Test-Path $WorkingFolder1)) {New-Item $WorkingFolder1 -ItemType Directory}
IF (!(Test-Path $WorkingFolder2)) {New-Item $WorkingFolder2 -ItemType Directory}
$ReadingFolder = [System.IO.Path]::GetDirectoryName($ObjFile_ENU)
IF (Test-Path $WorkingFolder1) {Remove-Item $WorkingFolder1\*.txt -recurse}
IF (Test-Path $WorkingFolder2) {Remove-Item $WorkingFolder2\*.txt -recurse}
IF ((Test-Path $ObjFile_ENU) -and (Test-Path $ReadingFolder\LNG.txt))
{
Import-NAVApplicationObjectLanguage -Destination $WorkingFolder1\TEMPLANG1.txt  -LanguagePath $ReadingFolder\LNG.txt -Source $ObjFile_ENU  -force
Split-NAVApplicationObjectFile -Source $WorkingFolder1\TEMPLANG1.txt -Destination $WorkingFolder2 -Force -PreserveFormatting
Join-NAVApplicationObjectFile -Source $WorkingFolder2\TAB*.txt -Destination $WorkingFolder2\alltables.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\REP*.txt -Destination $WorkingFolder2\allreports.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\COD*.txt -Destination $WorkingFolder2\allcodeunits.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\XML*.txt -Destination $WorkingFolder2\allXMLports.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\MEN*.txt -Destination $WorkingFolder2\allmenusuites.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\PAG*.txt -Destination $WorkingFolder2\allpages.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\QUE*.txt -Destination $WorkingFolder2\allqueries.txt
Write-Host 'Concatenating the separate object files into the AllObjects.txt, this may take a while.'
IF (Test-Path $WorkingFolder2\alltables.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\alltables.txt)}
IF (Test-Path $WorkingFolder2\allreports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allreports.txt)}
IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allcodeunits.txt)}
IF (Test-Path $WorkingFolder2\allXMLports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allXMLports.txt)}
IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allmenusuites.txt)}
IF (Test-Path $WorkingFolder2\allpages.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allpages.txt)}
IF (Test-Path $WorkingFolder2\allqueries.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allqueries.txt)}
IF (Test-Path $WorkingFolder2\alltables.txt) {Remove-Item $WorkingFolder2\alltables.txt}
IF (Test-Path $WorkingFolder2\allreports.txt) {Remove-Item $WorkingFolder2\allreports.txt}
IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Remove-Item $WorkingFolder2\allcodeunits.txt}
IF (Test-Path $WorkingFolder2\allXMLports.txt) {Remove-Item $WorkingFolder2\allXMLports.txt}
IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Remove-Item $WorkingFolder2\allmenusuites.txt}
IF (Test-Path $WorkingFolder2\allpages.txt) {Remove-Item $WorkingFolder2\allpages.txt}
IF (Test-Path $WorkingFolder2\allqueries.txt) {Remove-Item $WorkingFolder2\allqueries.txt}
IF (Test-Path $WorkingFolder2\allobjects.txt) {Copy-Item $WorkingFolder2\AllObjects.txt -destination $ConvFilePath -force}
Write-Host "Using $ObjFile_ENU, captions from LNG.txt were added to form a new object pack: $ConvFilePath"
}
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Sprachlayerimport mit flexiblen Parametern

28. August 2015 23:50

Nach der speziellen im letzten Beitrag nun die allgemeine Funktion (wie bei der Relativitätstheorie :mrgreen: ), die bis zu 3 Parameter aufnimmt (1. Quelldatei 2. Translationsdatei, 3. Ausgabedatei), bei einem Fehlen eines oder beider letzterer werden die gleichen Vorgabewerte wie in der oberen verwendet.

Im Bild wird die Funktion erst mit 1, dann mit 3 und am Schluss mit 2 Parametern verwendet. In der Ausgabezeile am Schluss ist zu erkennen, wie bei fehlenden Parametern die Vorgabewerte verwendet werden.
ImportAllLang.png


Code:
function ImportLangLayer
{
 [cmdletbinding()]
    param(
        [string]$ObjFile_ENU,
        [string]$LanguageFile,
        [string]$ConvFilePath
        )
# Version with 3 parameters if an optional varying language file or output file is required   
# if parameter 2 is missing, a file LNG.txt with the captions must be present in the same folder as the object file
# if parameter 3 is missing, a suffix _CAP will be added to the source object file to form the name of the output file
If ($ObjFile_ENU -eq '') {THROW 'Path of the object source file is missing.'}
$BasicPath = resolve-path $ObjFile_ENU
$FileParentPath = (get-item $ObjFile_ENU).parent.FullName
# Import-Module "C:\Program Files (x86)\Microsoft Dynamics NAV\80\RoleTailored Client\NavModelTools.ps1" -force -DisableNameChecking | out-null
if ($ConvFilePath -eq '')
{$ConvFilePath = [System.IO.Path]::GetDirectoryName($ObjFile_ENU) + "\"+ [System.IO.Path]::GetFileNameWithoutExtension($ObjFile_ENU) + "_CAP" + [System.IO.Path]::GetExtension($ObjFile_ENU)}
if (Test-Path $ConvFilePath) {Remove-Item $ConvFilePath}
$WorkingFolder1 = "$env:temp\TEMPLANG1"
$WorkingFolder2 = "$env:temp\TEMPLANG2"
IF (!(Test-Path $WorkingFolder1)) {New-Item $WorkingFolder1 -ItemType Directory}
IF (!(Test-Path $WorkingFolder2)) {New-Item $WorkingFolder2 -ItemType Directory}

$ReadingFolder = [System.IO.Path]::GetDirectoryName($ObjFile_ENU)
if ($LanguageFile -eq '') {$LanguageFile = "$ReadingFolder\LNG.txt"}
IF (Test-Path $WorkingFolder1) {Remove-Item $WorkingFolder1\*.txt -recurse}
IF (Test-Path $WorkingFolder2) {Remove-Item $WorkingFolder2\*.txt -recurse}
IF ((Test-Path $ObjFile_ENU) -and (Test-Path $LanguageFile))
{
Import-NAVApplicationObjectLanguage -Destination $WorkingFolder1\TEMPLANG1.txt  -LanguagePath $LanguageFile -Source $ObjFile_ENU  -force
Split-NAVApplicationObjectFile -Source $WorkingFolder1\TEMPLANG1.txt -Destination $WorkingFolder2 -Force -PreserveFormatting
Join-NAVApplicationObjectFile -Source $WorkingFolder2\TAB*.txt -Destination $WorkingFolder2\alltables.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\REP*.txt -Destination $WorkingFolder2\allreports.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\COD*.txt -Destination $WorkingFolder2\allcodeunits.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\XML*.txt -Destination $WorkingFolder2\allXMLports.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\MEN*.txt -Destination $WorkingFolder2\allmenusuites.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\PAG*.txt -Destination $WorkingFolder2\allpages.txt
Join-NAVApplicationObjectFile -Source $WorkingFolder2\QUE*.txt -Destination $WorkingFolder2\allqueries.txt
Write-Host 'Concatenating the separate object files into the AllObjects.txt, this may take a while.'
IF (Test-Path $WorkingFolder2\alltables.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\alltables.txt)}
IF (Test-Path $WorkingFolder2\allreports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allreports.txt)}
IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allcodeunits.txt)}
IF (Test-Path $WorkingFolder2\allXMLports.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allXMLports.txt)}
IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allmenusuites.txt)}
IF (Test-Path $WorkingFolder2\allpages.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allpages.txt)}
IF (Test-Path $WorkingFolder2\allqueries.txt) {Add-Content -path $WorkingFolder2\AllObjects.txt -value(Get-Content $WorkingFolder2\allqueries.txt)}
IF (Test-Path $WorkingFolder2\alltables.txt) {Remove-Item $WorkingFolder2\alltables.txt}
IF (Test-Path $WorkingFolder2\allreports.txt) {Remove-Item $WorkingFolder2\allreports.txt}
IF (Test-Path $WorkingFolder2\allcodeunits.txt) {Remove-Item $WorkingFolder2\allcodeunits.txt}
IF (Test-Path $WorkingFolder2\allXMLports.txt) {Remove-Item $WorkingFolder2\allXMLports.txt}
IF (Test-Path $WorkingFolder2\allmenusuites.txt) {Remove-Item $WorkingFolder2\allmenusuites.txt}
IF (Test-Path $WorkingFolder2\allpages.txt) {Remove-Item $WorkingFolder2\allpages.txt}
IF (Test-Path $WorkingFolder2\allqueries.txt) {Remove-Item $WorkingFolder2\allqueries.txt}
IF (Test-Path $WorkingFolder2\allobjects.txt) {Copy-Item $WorkingFolder2\AllObjects.txt -destination $ConvFilePath -force}
Write-Host "Using $ObjFile_ENU, captions from $LanguageFile were added to form a new object pack: $ConvFilePath"
}
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.