Microsoft Dynamics 365 Blog

This coffee break post illustrates how to search a text file for specific words or a phrase. You can do this with Windows PowerShell in any text files, but let’s use some Dynamics NAV objects exported as text. Technically speaking we are reading a text file then piping it line for line through a search cmdlet, which pipes matching lines further to a log.txt file.

Coffee Break 5 – Searching through a Dynamics NAV text file

Customer story:

The developer wants an automated way of locating all occurrences of a string (table name, field name, comment, …) in a country-specific version of Dynamics NAV, in this example the Norwegian version. And we will log the output of this search to a log file in c:\NAVApp\Log. 

Exporting objects from Dynamics NAV:

Prerequisites:

Crete a folder C:\MyNAVApp with a subfolder \Log so that the resulting full path is C:\MyNAVApp\Log.

For this purpose we use the Microsoft Dynamics NAV Application Merge Utilities. Note that these install to the equivalent of C:\Program Files (x86)\Microsoft Dynamics NAV\80\RoleTailored Client. This time we don’t need to import the Management module, only the application merge utilities:

Import-Module “${env:ProgramFiles(x86)}\Microsoft Dynamics NAV\80\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1”

  • Note 1: Make sure to import Microsoft.Dynamics.Nav.Model.Tools.psd1, and not NavModelTools.ps1.
  • Note 2: This will load the path for finsql.exe too, and use the finsql in the client folder.

Set a few variables. Assuming that we work in folder C:\MyNAVApp\, and we will be searching for where “G/L Account” table reference is used. And we will log the output of this search to a log file in the c:\MyNAVApp\Log folder.

$objectPath = ‘C:\MyNAVApp’
$sourcepath = Join-Path $ObjectPath ‘\MyObjects’

$NAVobjects = Join-Path $ObjectPath ‘NAVobjects.txt’
$LogPath = Join-Path $ObjectPath ‘\log\whereused.txt’
#Note, a search string can also be an array of strings
$SearchString = ‘”G/L Account”’

 

Export the objects you like, either all objects:
Export-NAVApplicationObject  –DatabaseName “Demo Database NAV (8-0)”DatabaseServer “.\NAVDEMO” –Path $NAVObjectFile

Or filter (choose the filter you like):

$FilterString = “Version List=*NAVNO*”
#or

$FilterString = “Modified=Yes”
Export-NAVApplicationObject  –DatabaseName “Demo Database NAV (8-0)”DatabaseServer “.\NAVDEMO” –Path $NAVObjectsFilter $FilterString 

#Split into individual object files

split-navapplicationobjectfileSource $NAVobjectsDestination $sourcepathPassThru -Force

Now load the list of files in the folder. We’re using the -File parameter with Get-ChildItem to limit the scope to files only (sub folders are not included).

$myobjects = Get-ChildItemPath $SourcePathFilter *txt -File

The next line shows a very simple way to read through all text files in the specified path (c:\MyNAVApp) and for each file searches for the search string (in our case “G/L Account) and for each hit pipe the source line to the log file along with the line number. For this we will use the Select-String cmdlet, that can work directly on Objects with File Info (objects returned by calling  Get-ChildItem cmdlet).

$myobjects | Select-String $SearchString | Out-FileFilepath $LogPath

Note that using the parameters and segments above implies that:

  • The script raises an error if the $ObjectPath does not exist.
  • Out-File will overwrite the existing file per pipeline
  • Out-File will append lines to the file, per pipeline object

 

Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA

Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA

Bas Graaf, Senior Software Engineer Dynamics NAV

 

We're always looking for feedback and would like to hear from you. Please head to the Dynamics 365 Community to start a discussion, ask questions, and tell us what you think!