PowerShell: Aus Fob-Datei Objektindex erzeugen

30. Juli 2015 17:35

Mit dieser Funktion kann aus einer Fob-Datei (den Dateipfad der Fob dazu als Parameter übergeben) die Objektliste aus dem Header ausgelesen werden.
FobHeader.png

Diese Objekte werden mit der gebrauchsfertigen Bezeichnung als leere Dateien im Usertempverzeichnis im Ordner TEMPINDEX abgelegt (dieser Ordner wird am Start gelöscht), von wo aus diese für Objektexporte, Kompiliervorgänge usw. genutzt werden können. Verwendbar sind diese Funktionen der finsql.exe ab NAV 2013, nicht mehr unterstützte Objekttypen wie Forms und Dataports in der Fobdatei werden daher im Skript ignoriert.
FobHeader3.png


Code:
function FobToIndexFiles
{
$FileExists = Test-Path $args
If ($FileExists -eq $False) {Throw "No $args file exists at this location."}
$FileExtension = [System.IO.Path]::GetExtension($args)
if ($FileExtension -eq '.fob')
{
$WorkingFolder = "$env:temp\TEMPINDEX\"
If (Test-Path $WorkingFolder) {Remove-Item $WorkingFolder -Recurse -Force}
$reader = [System.IO.File]::OpenText($args)
try {
    for(;;) {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }
        $FirstCharacter = $line.Substring(0,1)
        IF ([byte][char]$FirstCharacter -eq 26) { break }
        $ShortObjectType = $line.Substring(0,3).ToUpper()
        Switch ($ShortObjectType)
         {
         "FOR" {break}
         "DAT" {break}
         }
        if ($FirstCharacter -ne ' ')
        {
        Write-Host $line
        $ObjectID = $line.Substring(10,10)
        $ObjectID = $ObjectID.Trim()
        $NewFileName = "$ShortObjectType" + "$ObjectID" +'.TXT'
        $ExportPath = $WorkingFolder + $NewFileName
        New-Item $ExportPath -ItemType file -force
        }
    }
}
finally {
    $reader.Close()
}
}
else
{Throw 'Please use a Dynamics NAV object file with *.fob extension for this script.'}
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Umwandlung Forms -> Pages

30. Juli 2015 22:50

Mit dieser Variante für Upgradeprozesse kann man aus einer Fobdatei aus Versionen bis NAV 2009 mit Forms die entsprechenden Pages ermitteln.
Beispiel: Wenn Form 30 in der Fob vorhanden ist, wird eine PAG30.txt im Tempordner erzeugt.

In diesem Screenshot ist das Skript in Kombination mit einem Exportskript für die angepeilte neue Datenbank im Einsatz.
ForPag.png


Code:
    function FobToIndexFilesFormToPage
    {
    $FileExists = Test-Path $args
    If ($FileExists -eq $False) {Throw "No $args file exists at this location."}
    $FileExtension = [System.IO.Path]::GetExtension($args)
    if ($FileExtension -eq '.fob')
    {
    $WorkingFolder = "$env:temp\TEMPINDEX\"
    If (Test-Path $WorkingFolder) {Remove-Item $WorkingFolder -Recurse -Force}
    $reader = [System.IO.File]::OpenText($args)
    try {
        for(;;) {
            $line = $reader.ReadLine()
            if ($line -eq $null) { break }
            $FirstCharacter = $line.Substring(0,1)
            IF ([byte][char]$FirstCharacter -eq 26) { break }
            $ShortObjectType = $line.Substring(0,3).ToUpper()
            Switch ($ShortObjectType)
             {
             "FOR" {$ShortObjectType = 'PAG'}
             "DAT" {break}
             }
            if ($FirstCharacter -ne ' ')
            {
            Write-Host $line
            $ObjectID = $line.Substring(10,10)
            $ObjectID = $ObjectID.Trim()
            $NewFileName = "$ShortObjectType" + "$ObjectID" +'.TXT'
            $ExportPath = $WorkingFolder + $NewFileName
            New-Item $ExportPath -ItemType file -force
            }
        }
    }
    finally {
        $reader.Close()
    }
    }
    else
      {Throw 'Please use a Dynamics NAV object file with *.fob extension for this script.'}
    }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Objektindex mit GridView

2. August 2015 23:24

Bei dieser Funktion werden zusätzlich am Ende wie beim Fob-Viewer die als Datei erzeugten Objekte in einem GridView-Fenster angezeigt.

FobToIndexFilesGridView.gif

Code:
    function FobToIndexFilesGridView
    {
    $FileExists = Test-Path $args
    If ($FileExists -eq $False) {Throw "No $args file exists at this location."}
    $FileExtension = [System.IO.Path]::GetExtension($args)
    if ($FileExtension -eq '.fob')
    {
    $WorkingFolder = "$env:temp\TEMPINDEX\"
    If (Test-Path $WorkingFolder) {Remove-Item $WorkingFolder -Recurse -Force}
    $DataArray = New-Object System.Collections.Generic.List[object]
    $reader = [System.IO.File]::OpenText($args)
    try {
        for(;;) {
            $line = $reader.ReadLine()
            if ($line -eq $null) { break }
            $FirstCharacter = $line.Substring(0,1)
            IF ([byte][char]$FirstCharacter -eq 26) { break }
            $ShortObjectType = $line.Substring(0,3).ToUpper()
            Switch ($ShortObjectType)
             {
             "FOR" {break}
             "DAT" {break}
             }
            if ($FirstCharacter -ne ' ')
            {
            #Write-Host $line
            $ObjectType = $line.Substring(0,9).Trim()
            $ObjectID = $line.Substring(10,10).Trim()
            $ObjectName = $line.Substring(21,30)
            $ObjectDate = $line.Substring(54,10).Trim()
            $ObjectTime = $line.Substring(70,8).Trim()
           
            $NewFileName = "$ShortObjectType" + "$ObjectID" +'.TXT'
            $ExportPath = $WorkingFolder + $NewFileName
            New-Item $ExportPath -ItemType file -force
            }
            else
            {
            $ObjectSize = $line.Substring(10,10)
            $ObjectVersion = $line.Substring(21,57)
            $Obj =  New-Object Psobject -Property @{
                Type= $ObjectType
                ID =  $ObjectID
                Name = $ObjectName
                Date = $ObjectDate
                Time = $ObjectTime
                Size = $ObjectSize
                Version = $ObjectVersion
                }
            $DataArray.add($Obj)
            }
        }
    }
    finally {
        $reader.Close()
        $DataArray | Out-GridView  -title "Fobviewer $args" -wait
    }
    }
    else
    {Throw 'Please use a Dynamics NAV object file with *.fob extension for this script.'}
    }
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.