NAV PowerShell

9. Februar 2015 16:28

Was haltet ihr davon, wenn wir alle Infos rund um PowerShell für NAV in einem zentralen Thema bündeln?
Kowa hat in letzter Zeit schon viel in den entsprechenden NAV-Unterforen vermerkt. Ich würde mich freuen, wenn du, Kowa, die Informationen an dieser Stelle zusammen führen könntest.
Ich habe mir vorgenommen, die zahlreich vorhanden Blog-Links ebenfalls hier zu verewigen.

Den Anlass für dieses Thema aber lieferte mir folgende, neue Serie von Microsoft: Learn NAV PowerShell in your coffee breaks
Alle Folgen werden ab jetzt im o.g. Beitrag verlinkt.


Einführung
Unterscheidung zwischen NAV Administration Shell und NAV Development Shell, Nachladen von Modulen: siehe hier vs. PowerShell ISE
Falls beim erstmaligen Verwendung der PowerShell ISE (immer als Admin!) kommt ".. running scripts are disabled on this system...", dort folgenden Befehl ausführen:
Code:
Set-ExecutionPolicy –ExecutionPolicy RemoteSigned

Microsoft: Learn NAV PowerShell in your coffee breaks
"How Do I ..."-Videos zum Thema NAV PowerShell
Rückfragen unterdrücken
Kommandos auf mehrere Zeilen aufteilen
Load Dynamics NAV CmdLets in PowerShell ISE with Profiles
letstalknav.com: PowerShell

Funktionen (cmd-lets, Skripte)
Sammlung von Kowa
Download Waldo’s PowerShell Modules (How to Install)
Cumulative Updates:
Azure
Clients starten
Datenkbanken und Mandanten
NAV Objekte
Service Administration
Benutzer & Sessions
SQL-Server


Tools zur Erstellung eigener cmd-lets
Sammlung von Kowa

PowerShell vom NAV-Client aus ausführen
Add-In seit NAV 2016: Coffee Break: Use the PowerShell Runner Add-In

Learn NAV PowerShell in your coffee breaks

9. Februar 2015 16:29

Learn NAV PowerShell in your coffee breaks

Re: NAV PowerShell

10. Februar 2015 23:33

Das hier ist meine Zusammenstellung:

Interne Links
Mergetools, Objektim-/export, Compilerfunktionen, C/AL -> AL

Sprachlayer

SQL-Server
Textkonvertierung
Sonstiges

Hilfreich beim Erstellen der obigen Funktionen waren u.a.:
Externe Links

Re: NAV PowerShell

11. Februar 2015 08:48

Hallo,

ein weiterer interessanter Powershell- Link ist dieser hier
How to get back the 'hotfix directories' from NAV 2015 Cumulative Update 1

Gruß Fiddi

Re: NAV PowerShell

11. Februar 2015 12:16

Wobei es bei dem Script ggf. Sinnvoll ist, die Löschung der STX auszukommentieren (2 Mal), für den Fall, dass sie sich ändern, wie mit den letzten CUs.

Re: NAV PowerShell

11. März 2015 00:31

Falls parallele Installationen von NAV 2015, NAV 2013 R2 und NAV 2013 administriert werden müssen, kann die PowerShell mit der zugehörigen Profildatei per Shortcut gestartet werden, um jeweils die richtigen Module zu importieren. Im heutigen Coffeebreak 7 gibt es u.a. Tipps dazu:
Coffee Break - Creating and Using Windows PowerShell Profiles

Rückfragen unterdrücken

23. April 2015 11:42

Stören euch bei der Ausführung von cmdlets die Rückfragedialoge, könnt ihr sie folgendermaßen unterdrücken:
  • Parameter -Force nutzen (wenn vorhanden)
  • Wenn Parameter -Force nicht vorhanden, arbeitet mit –Confirm:$false
Quelle und ein paar kleine Hintergrundinfos mehr: Vjeko.com

letstalknav.com

20. Januar 2016 09:23

letstalknav.com beginnt demnächst eine Serie speziell zum Thema PowerShell für NAV. Dieser Foreneintrag wird daher im Laufe der Zeit um neue Artikel erweitert.

Startbeitrag: Why should I use PowerShell? And How?!
Part 1 (Getting Started, Changing NAV License)

Re: NAV PowerShell

21. August 2016 10:14

Die Skripte waren es ja schon immer :wink: , aber nun ist auch PowerShell selber ein Open-Source-Projekt und auch unter Linux verfügbar.
PowerShell is open sourced and is available on Linux

"WhereUsed" mit PowerShell

23. September 2016 12:52

"WhereUsed" mit PowerShell

Re: NAV PowerShell

27. September 2016 08:08

Hallo,

@WhereUsed

Wobei ich dem Artikel nur bis zum Split folgen würde. Danach würde ich einen Editor wie z.B. Notepad++ einsetzten, der es ermöglicht mehrere Dateien in einem Verzeichnis zu durchsuchen. Notepad++ findet genauso wie der "Get-ChildItem" alle Vorkommen der Variable, bietet dann aber die Möglichkeit per Doppelclick die Objekt- Textdatei zu öffnen, und zu der Stelle im Quelltext zu verzweigen, an der die Variable verwendet wird.

Mal ganz davon abgesehen, das "Posting Date" an so vielen Stellen definiert wird, das man mit einer reinen Textsuche nicht wirklich nur die Verwendung von z.B. SalesHeader."Posting Date" findet. :wink:

Gruß Fiddi

Re: NAV PowerShell

27. September 2016 09:25

Der WhereUsed-Artikel ist m.E. eher als Beispiel zu verstehen, wie man so etwas prinzipiell macht.
Wenn man diese Zeile nicht versteht
Code:
Get-ChildItem “.\single” -recurse | Select-String -pattern “Posting Date” | group path | select name, count

(und ich weiß, dass auch 3 Jahre nach der Einführung von PowerShell im NAV-Umfeld viele Entwickler dieses nicht können) ist jeder Artikel willkommen, um diese Situation zu verbessern. Ohne PowerShell-Kenntnisse wird man es in den nächsten Jahren zunehmend schwerer haben, die anfallenden Aufgaben zu bewältigen.

Re: NAV PowerShell

27. September 2016 10:42

Hallo,

Code:
grep -c "Posting Date" ./single/*.txt|grep -v ":0$"


Funktioniert unter Windows 10 neuerdings auch :mrgreen:

Gruß Fiddi

Re: NAV PowerShell

8. November 2017 15:42

fiddi hat geschrieben:Hallo,
ein weiterer interessanter Powershell- Link ist dieser hier
How to get back the 'hotfix directories' from NAV 2015 Cumulative Update 1

Im Skript im Blogartikel fehlen diese länderspezfischen Ordner für RTC und NST, hier ergänzt am Beispiel von DE, für AT und CH usw. mit den dortigen Ordnernamen entsprechend verfahren. Die befinden auf der DVD im Pfad des Installers-Ordners, nicht wie die ENU-Dateien im RoleTailored Client-Ordner.

Diese Ordner enthalten u.a. die fin.etx/fin.stx-Dateien, die bei falscher Version zu Fehlermeldungen beim Clientstart oder Aktivitäten wie Datenbankkonvertierungen usw. führen.

HotfixDirectories.png


Code:
 # Language Specific Folders
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\RTC\de-DE
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\RTC\DEU
 
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\NST\Add-ins
 # Language Specific Folder
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\NST\de-DE


Code:
 # Language Specific Files for DE
 # RTC
 # Path Example C:\CU 25 NAV 2016 DE\NAV.9.0.49424.DE.DVD\Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\90\RoleTailored Client
 Copy-Item $DvdDirectory\"Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\"$NavVersion"\RoleTailored Client\de-DE"\* -destination $BatchDirectory\_Temp\RTC\de-DE -recurse -Force
 Copy-Item $DvdDirectory\"Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\"$NavVersion"\RoleTailored Client\DEU"\* -destination $BatchDirectory\_Temp\RTC\DEU -recurse -Force
 # NST
 # Path Example C:\CU 25 NAV 2016 DE\NAV.9.0.49424.DE.DVD\Installers\DE\Server\PFiles\Microsoft Dynamics NAV\90\Service\de-DE
 Copy-Item $DvdDirectory\"Installers\DE\Server\PFiles\Microsoft Dynamics NAV\"$NavVersion"\Service\de-DE"\* -destination $BatchDirectory\_Temp\NST\de-DE -recurse -Force


Außerdem wie SilverX oben schon erwähnte, diese Zeilen auskommentieren, weil diese Ordner auch bei einem "mise à jour" bedacht werden müssen.
Code:
# Keep these !
 #RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'ENU')
 #RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'en-US')
 
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Power Shell 6

15. Dezember 2017 01:17

Mit der neuen Version PowerShell 6, die in den nächsten Tagen erscheint, gibt es den massivsten Umbruch bisher und einen ähnlichen Umwälzungsprozess wie bei NAV.
Die aktuelle Version 5.1 für Windows wird nicht mehr weiterentwickelt.
PS 6 ist plattformneutral und Open-Source und baut auf .NET Core auf (daher auch jetzt PowerShell Core genannt), nicht mehr auf dem umfangreicheren .NET-Framework welches nur in Windows zu Verfügung steht.
Das ISE fällt damit leider auch weg, stattdessen gibt es eine Extension für VS Code.
Get started with PowerShell development in Visual Studio Code

PowerShell Core 6 erscheint als Release Candidate, RTM im Januar
http://www.powertheshell.com/isesteroidsvnext/

Erstellung der Hotfixordner ab NAV 2018

8. Januar 2018 16:18

In NAV 2018 ergeben sich Veränderungen in der DVD-Struktur, Sprachordner wie de-DE, bislang in Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\<NavVersion>\RoleTailored Client\ und der BPA-Order (Best Practices Analyzer), der ja schon seit NAV 2016 nicht mehr gepflegt wurde, wurden entfernt.
Das führt zu Laufzeitfehlern im bisherigen Skript, hier das dafür und auch sonst aktualisierte Skript, um die Hotfixordner zu erzeugen.
Code:
<#
 .SYNOPSIS
 This cmdlet copies all the DVD files to create a batch ready set of files.
 .DESCRIPTION
 This cmdlet copies all the DVD files to create a batch ready set of files..
 It skips files that are not needed in installation scenarios such as .config files.
 .PARAMETER DvdDirectory
 Specifies the directory where the uncompressed Cumulative Update DVD subdirectory is located.
 .PARAMETER BatchDirectory
 Specifies the directory that should hold the result set of files, i.e., the directory to copy to.
#>
function Copy-UpdateFilesToBatchDirectoryAllVersions
{
 [CmdletBinding()]
 param (
 [parameter(Mandatory=$true)]
 [string] $DvdDirectory,

 [parameter(Mandatory=$true)]
 [string] $BatchDirectory
 )
 PROCESS
 {
 # Copy all the Dvd files to a _TEMP folder
 if (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\70")
 {
 $NavVersion = "70"
 }
  if (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\71")
 {
 $NavVersion = "71"
 }
 if (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\80")
 {
 $NavVersion = "80"
 }
 elseif (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\90")
 {
 $NavVersion = "90"
 }
 elseif (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\100")
 {
 $NavVersion = "100"
 }
 elseif (Test-Path -Path $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\110")
 {
 $NavVersion = "110"
 }
 else
 {
 Write-Host Please check your DvdDirectory parameter
 return
 }

 Write-Verbose "Copying files from $DvdDirectory to $BatchDirectory\_Temp\..."
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\RTC\Add-ins
 # Language Specific Folders
 if (-not $NavVersion -eq "110")
 {
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\RTC\de-DE
 }
 
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\RTC\DEU
 
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\NST\Add-ins
 # Language Specific Folder
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\NST\de-DE
 if (-not $NavVersion -eq "110")
 {
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\BPA
 }
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\"WEB CLIENT"
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\OUTLOOK
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\ADCS
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\HelpServer
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\UpgradeToolKit
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\WindowsPowerShellScripts
 if (($NavVersion -eq "90") -or ($NavVersion -eq "100") -or ($NavVersion -eq "110"))
 {
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\CrmCustomization
 New-Item -ItemType Directory -Force -Path $BatchDirectory\_Temp\TestToolKit
 }

 Copy-Item $DvdDirectory\"RoleTailoredClient\program files\Microsoft Dynamics NAV\"$NavVersion"\RoleTailored Client"\* -destination $BatchDirectory\_Temp\RTC -recurse -Force
 Copy-Item $DvdDirectory\"ServiceTier\program files\Microsoft Dynamics NAV\"$NavVersion"\Service"\* -destination $BatchDirectory\_Temp\NST -recurse -Force
 if (-not $NavVersion -eq "110")
 {
 Copy-Item $DvdDirectory\BPA\* -destination $BatchDirectory\_Temp\BPA -recurse -Force
 }
 Copy-Item $DvdDirectory\"WebClient\Microsoft Dynamics NAV\"$NavVersion"\Web Client"\* -destination $BatchDirectory\_Temp\"WEB CLIENT" -recurse -Force
 Copy-Item $DvdDirectory\"Outlook\program files\Microsoft Dynamics NAV\"$NavVersion"\OutlookAddin"\* -destination $BatchDirectory\_Temp\OUTLOOK -recurse -Force
 Copy-Item $DvdDirectory\"ADCS\program files\Microsoft Dynamics NAV\"$NavVersion"\Automated Data Capture System"\* -destination $BatchDirectory\_Temp\ADCS -recurse -Force
 Copy-Item $DvdDirectory\"HelpServer\DynamicsNAV"$NavVersion"Help"\* -destination $BatchDirectory\_Temp\HelpServer -recurse -Force
 Copy-Item $DvdDirectory\"UpgradeToolKit"\* -destination $BatchDirectory\_Temp\UpgradeToolKit -recurse -Force
 Copy-Item $DvdDirectory\"WindowsPowerShellScripts"\* -destination $BatchDirectory\_Temp\WindowsPowerShellScripts -recurse -Force
 if (($NavVersion -eq "90") -or ($NavVersion -eq "100") -or ($NavVersion -eq "110"))
 {
 Copy-Item $DvdDirectory\"CrmCustomization"\* -destination $BatchDirectory\_Temp\CrmCustomization -recurse -Force
 Copy-Item $DvdDirectory\"TestToolKit"\* -destination $BatchDirectory\_Temp\TestToolKit -recurse -Force
 }
 # Language Specific Files for DE
 # RTC
 # Path Example C:\CU 25 NAV 2016 DE\NAV.9.0.49424.DE.DVD\Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\90\RoleTailored Client
 if (-not $NavVersion -eq "110")
 {
 Copy-Item $DvdDirectory\"Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\"$NavVersion"\RoleTailored Client\de-DE"\* -destination $BatchDirectory\_Temp\RTC\de-DE -recurse -Force
 }
 Copy-Item $DvdDirectory\"Installers\DE\RTC\PFiles\Microsoft Dynamics NAV\"$NavVersion"\RoleTailored Client\DEU"\* -destination $BatchDirectory\_Temp\RTC\DEU -recurse -Force
 # NST
 # Path Example C:\CU 25 NAV 2016 DE\NAV.9.0.49424.DE.DVD\Installers\DE\Server\PFiles\Microsoft Dynamics NAV\90\Service\de-DE
 if (-not $NavVersion -eq "110")
 {
 Copy-Item $DvdDirectory\"Installers\DE\Server\PFiles\Microsoft Dynamics NAV\"$NavVersion"\Service\de-DE"\* -destination $BatchDirectory\_Temp\NST\de-DE -recurse -Force
 }
 
 
 Write-Verbose "Done copying files RTC files from $DvdDirectory to $BatchDirectory\_Temp."
 
 # Delete files that are not needed for an installation scenario
 Write-Verbose "Deleting files from $BatchDirectory that are not needed for the batch directory..."


 Get-ChildItem $BatchDirectory\_Temp -include '*.chm' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 Get-ChildItem $BatchDirectory\_Temp -include '*.hh' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 Get-ChildItem $BatchDirectory\_Temp -include '*.config' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 Get-ChildItem $BatchDirectory\_Temp -include '*.ico' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 Get-ChildItem $BatchDirectory\_Temp -include '*.flf' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 Get-ChildItem $BatchDirectory\_Temp -include '*.sln' -Recurse | Remove-Item -force -ErrorAction SilentlyContinue
 # Keep these !
 #RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'ENU')
 #RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'en-US')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'Images')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'SLT')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\RTC\ 'ReportLayout')
 if (-not $NavVersion -eq "110")
 {
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\BPA\ 'Scripts')
 }
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\HelpServer\ 'css')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\HelpServer\ 'help')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\HelpServer\ 'images')
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\_Temp\WindowsPowerShellScripts\ 'ApplicationMergeUtilities')
 Write-Verbose "Done deleting files from $BatchDirectory that are not needed for for the batch directory."

 # Copy the result to the requested directory and remove the _Temp folder
 Copy-Item $BatchDirectory\_Temp\* -destination $BatchDirectory\ -recurse -Force
 RemoveUnnecessaryDirectory (Join-Path $BatchDirectory\ '_Temp')
 }
}

function RemoveUnnecessaryDirectory
{
 param ([string]$directory)
 Remove-Item $directory -force -Recurse -ErrorAction SilentlyContinue
}

Skript als .exe: PS2EXE-GUI

16. Januar 2018 18:25

Skripte, die man immer wieder mal braucht oder manuell viel und schnell ausführen möchte, kann man auch in eine .exe-Datei umwandeln.
PS2EXE-GUI: "Convert" PowerShell Scripts to EXE Files with GUI
Da fehlt dann nur noch der Link auf dem Desktop :wink: .

Als Beispiel im Anhang mein mit dem obigen Tool umgewandeltes Downgradeskript für NAV 2018 Objektdateien als .exe-Datei.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: NAV PowerShell

21. Februar 2018 14:46

Für das Erzeugen der Hotfixordner bei Updates gibt es ein neues Skript: How to generate the ‘hotfix directories’ from Microsoft Dynamics NAV

Jetzt sogar mit optionaler Sprachausgabe. Klappt auch auf Deutsch (auf einem DE-System sogar besser weil die Sprachangabe im Skript fehlt, das führt zu einem fürchterlichen deutschen Akzent bei den englischen Sätzen :-) )
Zum Testen reichen diese 3 Zeilen.
Code:
Add-Type -AssemblyName System.Speech
$synthesizer = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer
$synthesizer.Speak("Hallo, hier ist ihr HAL 9000 Computer. Was kann ich für Sie tun?")


Give PowerShell a Voice Using The SpeechSynthesizer Class

Re: NAV PowerShell

17. September 2018 15:17

What's New in PowerShell Core 6.1
u.a. außer spürbaren Performancesteigerungen bei einigen Cmdlets stellt das jetzt enthaltene Windows Compatibility Pack für .NET Core fehlende Funktionen für ältere Windowsskripte, die auf Grundlage des .NET-Frameworks entwickelt wurden, wieder zur Verfügung.
Changelog

Re: NAV PowerShell

4. August 2019 16:15

PowerShell for non-experts…

Re: NAV PowerShell

5. März 2020 16:17

PowerShell 7.0 freigegeben: Eine Shell für (fast) alle und (fast) alles

[Nachtrag 07.06.21]: Für bccontainerhelper ist derzeit nur PowerShell 5.1 verwendbar, da Version 7 (und 6 natürlich auch) u.a. wegen der ab Version 6 plattformübergreifenden Konzeption und der damit bedingten Beschränkung auf .NET Core nicht abwärtskompatibel sind.
https://github.com/microsoft/navcontain ... -832655697

Re: NAV PowerShell

20. Oktober 2020 20:56

Ab Windows 10 1903 (10.18362.x) gibt es für Kommandozeile und PowerShell etwas Frisches: Windows Terminal
https://github.com/microsoft/terminal

Re: NAV PowerShell

2. März 2021 14:06

Managing secrets in your scripts