Freigeben über


"WhereUsed" mit PowerShell

Mal angenommen ich möchte wissen, wo überall das Feld „Posting Date“ verwendet wird.

Dazu wäre es gut, wenn ich alle Objekte durchsuchen könnte und als Ergebnis eine Liste bekomme die mir sagt, in welchen Objekten die entsprechenden Felder benutzt werden.

Um das mit PowerShell umzusetzen, sind eigentlich nur drei Kommandos notwendig.

  • Export-NAVApplicationObject  -DatabaseName CRONUSDB -Path .\export.txt

 

Mit Export-NAVApplicationObject wird im obigen Beispiel aus der Datenbank CORNUSDB im aktuellen Verzeichnis eine Datei mit dem Namen export.txt angelegt.

Ich lege dann ein Unterverzeichnis mit dem Namen „Single“ an. Ich möchte in diesem Verzeichnis jedes Objekt als einzelne Datei haben.

  • Split-NAVApplicationObjectFile -Source export.txt -Destination .\Single

 

Erledigt diese Arbeit.

Im Anschluss daran müssen wir nur noch alle Dateien nach dem gewünschten Feldnamen beispielsweise durchsuchen. Auch dafür gibt es ein Kommando:

  1. Get-ChildItem “.\single” -recurse | Select-String -pattern “Posting Date” | group path | select name, count

 

Das Ergebnis sieht in etwa so aus (nur ein Auszug der Gesamtliste). Jede Datei ist ein Objekt und wird dann entsprechend aufgelistet und in „Count“ wird angegeben, wie oft der String in der Datei gefunden wurde.

Name                    Count ----                    ----- D:\Temp\TAB271.TXT         8 D:\Temp\TAB169.TXT         9 D:\Temp\TAB331.TXT         3 D:\Temp\TAB270.TXT         8 D:\Temp\TAB167.TXT        12 D:\Temp\TAB1001.TXT        6 D:\Temp\XML1.TXT           3 D:\Temp\REP204.TXT         2 D:\Temp\TAB39.TXT         23 D:\Temp\TAB156.TXT         6 D:\Temp\TAB981.TXT         1
 

Das Ergebnis können wir in eine Datei umleiten und schon haben wir unsere Liste. Jetzt macht es Sinn, das in ein eigenes Script zu schreiben so dass wir es nach folgendem Schema aufrufen können.

WhereUsed DATENBANK „Pfad für Einzeldateien“ „Exportdateiname“ „Suchtext“

Das Script unten fragt die Parameter ab, wenn sie nicht in der Kommandozeile angegeben sind. Der Export der Objekte kann ein paar Minuten dauern und genauso das Aufteilen in Einzeldateien. Dies wird allerdings nur beim ersten Mal gemacht. Sind die Exportdatei oder die Einzelobjekte schon vorhanden, wird dieser Teil übersprungen. Wichtig ist noch der Import des Moduls. In diesem Beispiel habe ich das Modul für Microsoft Dynamics NAV 2016 genutzt und dort auch die Standardverzeichnisse angegeben. Das müssen Sie ggf. Anpassen.

Viel Spaß damit.

Andreas Günther

Microsoft Dynamics Germany

# Parameter abfragen, wenn Sie nicht angegeben sind.

param (

[parameter(Mandatory=$true)]

[string] $database,

[parameter(Mandatory=$true)]

[string] $singlefiledirectory,

[parameter(Mandatory=$true)]

[string] $ExportFileName,

[parameter(Mandatory=$true)]

[string] $searchtext

)

# Diese Datei der Version anpassen

Import-Module "C:\Program Files (x86)\Microsoft Dynamics NAV\90\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1" >null

Get-Command -Module Microsoft.Dynamics.Nav.Apps.Tools

# Wenn nicht alle Parameter angegeben sind, wird eine Fehlermeldung angegeben

if($database -And $singlefiledirectory -And $searchtext -And $ExportFileName)

{

    # Sollte die Datei mit den Objekten noch nicht vorhanden sein, werden alle Objekte in den angegebenen Dateinamen exportiert (Endung sollte .txt sein)

    # Die Datei sollte nicht im gleichen Verzeichnis liegen wie die Einzelobjekte - da diese sonst nicht exportiert werden

    if (-Not (Test-Path $ExportFileName))

    {  

        write-host "Export aller Objekte..."

        Export-NAVApplicationObject  -DatabaseName $database -Path $ExportFileName >null

    }

    Else

    {

        write-host "Export übersprungen $ExportFileName schon vorhanden"

    }

    # Ist das Verzeichnis für die Einzelobjektdateien nicht leer - wird dieser Schritt übersprungen

    if (-Not (Test-Path "$singlefiledirectory\*"))

    {

        write-host "Aufteilen der Objekte in Einzeldateien..."

        Split-NAVApplicationObjectFile -Source ".\export.txt" -Destination $singlefiledirectory

    } else

    {

        

        write-host "Aufteilen der Datei überprungen $singlefiledirectory ist nicht leer"

    }

    # Hiermit wird dann im Verzeichnis nach dem Text gesucht und als Ergebnis der Dateiname und die Anzahl der Fundstellen aufgelistet

    Get-ChildItem $singlefiledirectory -recurse | Select-String -pattern $searchtext | group path | select name, count

}

Else

{

    write-host "Parameter fehlen!"

    write-host "Aufruf mit: WhereUsed Datenbank Objektordner DateinameObjektdatei Suchstring"

}

“Microsoft provides programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability or fitness for a particular purpose. This mail message assumes that you are familiar with the programming language that is being demonstrated and the tools that are used to create and debug procedures.