Montag, 14. Juli 2008

Powershell Command History & Performance

Powershell die Zukunft der Kommandozeile auf Windows Systemen? Ein par Verbesserungen gibt es noch und die kommen zum Teil auch in Version 2.0.

Lieder wird die Command History nicht gespeichert. So ist bei einer neuen Session alle Commands weg, die schon einmal verwendet wurden. Dies kann mit einem Profile Script nicht ganz befriedigend aber funktionierend nach gebessert werden.



  1. Muss die ExecutionPolicy gesetzt werden. Sonst werden keine Scripts ausgeführt. Hier gibt es 4 Varinaten die sind beschrieben unter help about_signing. Da wir ja wissen was wir machen verwenden wir die unsicherste ;-)

    Set-ExecutionPolicy Unrestricted

  2. %userprofile%\Documents\WindowsPowerShell die Datei Microsoft.PowerShell_profile.ps1 erstellen und in Notepad öffnen.

  3. Folgendes Script Kopieren und einfügen.

    Set-Location C:\

    $MaximumHistoryCount = 1KB

    if (!(Test-Path ~\PowerShell -PathType Container))

    { New-Item ~\PowerShell -ItemType Directory

    }

    function bye

    { Get-History -Count $MaximumHistoryCount Export-CSV ~\PowerShell\history.csv

    exit

    }

    if (Test-path ~\PowerShell\History.csv)

    { Import-CSV ~\PowerShell\History.csv Add-History

    }

Beim Öffnen der Shell wird das gespeicherte csv wieder in die History geschrieben. Was leider nicht so schön ist, dass beim verlassen der Shell das Kommando bye eingeben werden muss. Sonst wird die Funktion nicht aufgerufen und die History ist weg.

Nun kann mit get-history Alias h oder mit invoke-history Alias r die letzten Kommandos wieder dargestellt oder verwendet werden.

http://blogs.msdn.com/powershell/archive/2006/07/01/653194.aspx

Ein weiters Problem ist das aufstarten der Powershell. Da vergehen Sekunden bis das erste Kommando eigegenem werden kann.

Hier hilft auch ein Script das die Powershell assamblies Compiliert. Das Script muss nur nach der Installation einmal ausgeführt werden. Solange kein Update für Powershell installiert wird ist das aufstarten einiges schneller.

Set-Alias ngen @(

dir (join-path ${env:\windir} "Microsoft.NET\Framework") ngen.exe -recurse |

sort -descending lastwritetime

)[0].fullName

[appdomain]::currentdomain.getassemblies() | %{ngen $_.location}


http://blogs.msdn.com/powershell/archive/2007/11/08/update-gac-ps1.aspx

1 Kommentar:

Anonym hat gesagt…

uh... thanks for thoughts