about_Scripts
Kurze Beschreibung
Beschreibt, wie Skripts in PowerShell ausgeführt und geschrieben werden.
Lange Beschreibung
Ein Skript ist eine Nur-Text-Datei, die mindestens einen PowerShell-Befehl enthält.
PowerShell-Skripts haben eine .ps1
Dateierweiterung.
Das Ausführen eines Skripts ähnelt dem Ausführen eines Cmdlets. Sie geben den Pfad und dateinamen des Skripts ein und verwenden Parameter zum Senden von Daten und Festlegen von Optionen. Sie können Skripts auf Ihrem Computer oder in einer Remotesitzung auf einem anderen Computer ausführen.
Das Schreiben eines Skripts speichert einen Befehl für die spätere Verwendung und erleichtert die Freigabe für andere Personen. Vor allem können Sie die Befehle einfach ausführen, indem Sie den Skriptpfad und den Dateinamen eingeben. Skripts können so einfach wie ein einzelner Befehl in einer Datei oder so umfangreich wie ein komplexes Programm sein.
Skripts verfügen über zusätzliche Features, z. B. den #Requires
speziellen Kommentar, die Verwendung von Parametern, die Unterstützung für Datenabschnitte und die digitale Signatur für Sicherheit.
Sie können auch Hilfethemen für Skripts und für alle Funktionen im Skript schreiben.
Ausführen eines Skripts
Bevor Sie ein Skript unter Windows ausführen können, müssen Sie die Standardmäßige PowerShell-Ausführungsrichtlinie ändern. Die Ausführungsrichtlinie gilt nicht für PowerShell, die auf Nicht-Windows-Plattformen ausgeführt wird.
Die Standardausführungsrichtlinie verhindert, Restricted
dass alle Skripts ausgeführt werden, einschließlich Skripts, die Sie auf dem lokalen Computer schreiben. Weitere Informationen finden Sie unter Informationen zu Ausführungsrichtlinien.
Die Ausführungsrichtlinie wird in der Registrierung gespeichert, daher müssen Sie sie nur einmal auf jedem Computer ändern.
Verwenden Sie zum Ändern der Ausführungsrichtlinie das folgende Verfahren.
Geben Sie an der Eingabeaufforderung Folgendes ein:
Set-ExecutionPolicy AllSigned
oder
Set-ExecutionPolicy RemoteSigned
Die Änderung wird sofort wirksam.
Geben Sie zum Ausführen eines Skripts den vollständigen Namen und den vollständigen Pfad zur Skriptdatei ein.
Wenn Sie beispielsweise das Skript Get-ServiceLog.ps1 im Verzeichnis C:\Scripts ausführen möchten, geben Sie Folgendes ein:
C:\Scripts\Get-ServiceLog.ps1
Um ein Skript im aktuellen Verzeichnis auszuführen, geben Sie den Pfad zum aktuellen Verzeichnis ein, oder verwenden Sie einen Punkt, um das aktuelle Verzeichnis darzustellen, gefolgt von einem Pfad umgekehrter Schrägstrich (.\
).
Um beispielsweise das Skript ServicesLog.ps1 im lokalen Verzeichnis auszuführen, geben Sie Folgendes ein:
.\Get-ServiceLog.ps1
Wenn das Skript Parameter enthält, geben Sie die Parameter und Parameterwerte nach dem Skriptdateinamen ein.
Der folgende Befehl verwendet beispielsweise den ServiceName-Parameter des Get-ServiceLog-Skripts, um ein Protokoll der WinRM-Dienstaktivität anzufordern.
.\Get-ServiceLog.ps1 -ServiceName WinRM
Als Sicherheitsfeature führt PowerShell keine Skripts aus, wenn Sie auf das Skriptsymbol in Explorer doppelklicken oder wenn Sie den Skriptnamen ohne vollständigen Pfad eingeben, auch wenn sich das Skript im aktuellen Verzeichnis befindet. Weitere Informationen zum Ausführen von Befehlen und Skripts in PowerShell finden Sie unter about_Command_Precedence.
Mit PowerShell ausführen
Ab PowerShell 3.0 können Sie Skripts aus Explorer ausführen.
So verwenden Sie das Feature "Mit PowerShell ausführen":
Führen Sie Explorer aus, klicken Sie mit der rechten Maustaste auf den Dateinamen des Skripts, und wählen Sie dann "Mit PowerShell ausführen" aus.
Das Feature "Mit PowerShell ausführen" wurde entwickelt, um Skripts auszuführen, die nicht über erforderliche Parameter verfügen und die Ausgabe nicht an die Eingabeaufforderung zurückgeben.
Weitere Informationen finden Sie unter about_Run_With_PowerShell.
Ausführen von Skripts auf anderen Computern
Verwenden Sie den FilePath-Parameter des Invoke-Command
Cmdlets, um ein Skript auf einem oder mehreren Remotecomputern auszuführen.
Geben Sie den Pfad und dateinamen des Skripts als Wert des FilePath-Parameters ein. Das Skript muss sich auf dem lokalen Computer oder in einem Verzeichnis befinden, auf das der lokale Computer zugreifen kann.
Mit dem folgenden Befehl wird das Get-ServiceLog.ps1
Skript auf den Remotecomputern "Server01" und "Server02" ausgeführt.
Invoke-Command -ComputerName Server01,Server02 -FilePath `
C:\Scripts\Get-ServiceLog.ps1
Hilfe zu Skripts abrufen
Das Cmdlet "Get-Help" ruft die Hilfethemen für Skripts sowie für Cmdlets und andere Arten von Befehlen ab. Um das Hilfethema für ein Skript abzurufen, geben Sie Get-Help
gefolgt vom Pfad und Dateinamen des Skripts ein. Wenn sich der Skriptpfad in Ihrer Path
Umgebungsvariable befindet, können Sie den Pfad weglassen.
Um z. B. Hilfe für das Skript ServicesLog.ps1 zu erhalten, geben Sie Folgendes ein:
get-help C:\admin\scripts\ServicesLog.ps1
Schreiben eines Skripts
Ein Skript kann alle gültigen PowerShell-Befehle enthalten, einschließlich einzelner Befehle, Befehle, die die Pipeline, Funktionen und Steuerelementstrukturen wie If-Anweisungen und For-Schleifen verwenden.
Um ein Skript zu schreiben, öffnen Sie eine neue Datei in einem Text-Editor, geben Sie die Befehle ein, und speichern Sie sie in einer Datei mit einem gültigen Dateinamen mit der .ps1
Dateierweiterung.
Das folgende Beispiel ist ein einfaches Skript, das die Dienste abruft, die auf dem aktuellen System ausgeführt werden, und speichert sie in einer Protokolldatei. Der Protokolldateiname wird aus dem aktuellen Datum erstellt.
$date = (get-date).dayofyear
get-service | out-file "$date.log"
Um dieses Skript zu erstellen, öffnen Sie einen Text-Editor oder einen Skript-Editor, geben Sie diese Befehle ein, und speichern Sie sie dann in einer Datei mit dem Namen ServiceLog.ps1
.
Parameter in Skripts
Verwenden Sie zum Definieren von Parametern in einem Skript eine Param-Anweisung. Die Param
Anweisung muss die erste Anweisung in einem Skript sein, mit Ausnahme von Kommentaren und anweisungen #Require
.
Skriptparameter funktionieren wie Funktionsparameter. Die Parameterwerte sind für alle Befehle im Skript verfügbar. Alle Features von Funktionsparametern, einschließlich des Parameter-Attributs und der benannten Argumente, sind auch in Skripts gültig.
Beim Ausführen des Skripts geben Skriptbenutzer die Parameter nach dem Skriptnamen ein.
Das folgende Beispiel zeigt ein Test-Remote.ps1
Skript mit einem ComputerName-Parameter . Beide Skriptfunktionen können auf den ComputerName-Parameterwert zugreifen.
param ($ComputerName = $(throw "ComputerName parameter is required."))
function CanPing {
$error.clear()
$tmp = test-connection $computername -erroraction SilentlyContinue
if (!$?)
{write-host "Ping failed: $ComputerName."; return $false}
else
{write-host "Ping succeeded: $ComputerName"; return $true}
}
function CanRemote {
$s = new-pssession $computername -erroraction SilentlyContinue
if ($s -is [System.Management.Automation.Runspaces.PSSession])
{write-host "Remote test succeeded: $ComputerName."}
else
{write-host "Remote test failed: $ComputerName."}
}
if (CanPing $computername) {CanRemote $computername}
Geben Sie zum Ausführen dieses Skripts den Parameternamen nach dem Skriptnamen ein. Zum Beispiel:
C:\PS> .\test-remote.ps1 -computername Server01
Ping succeeded: Server01
Remote test failed: Server01
Weitere Informationen zur Param-Anweisung und den Funktionsparametern finden Sie unter about_Functions und about_Functions_Advanced_Parameters.
Schreiben von Hilfe für Skripts
Sie können ein Hilfethema für ein Skript schreiben, indem Sie eine der beiden folgenden Methoden verwenden:
Kommentarbasierte Hilfe für Skripts
Erstellen Sie ein Hilfethema mithilfe spezieller Schlüsselwort (keyword) in den Kommentaren. Um eine kommentarbasierte Hilfe für ein Skript zu erstellen, müssen die Kommentare am Anfang oder Ende der Skriptdatei platziert werden. Weitere Informationen zur kommentarbasierten Hilfe finden Sie unter about_Comment_Based_Help.
XML-basierte Hilfe für Skripts
Erstellen Sie ein XML-basiertes Hilfethema, z. B. den Typ, der normalerweise für Cmdlets erstellt wird. Xml-basierte Hilfe ist erforderlich, wenn Sie Hilfethemen in mehrere Sprachen übersetzen.
Um das Skript dem XML-basierten Hilfethema zuzuordnen, verwenden Sie die . ExternalHelp-Hilfekommentar Schlüsselwort (keyword). Weitere Informationen zum ExternalHelp-Schlüsselwort (keyword) finden Sie unter about_Comment_Based_Help. Weitere Informationen zur XML-basierten Hilfe finden Sie in der Hilfe zum Schreiben von Cmdlets.
Zurückgeben eines Ausgangswerts
Standardmäßig geben Skripts keinen Beendigungsstatus zurück, wenn das Skript beendet wird. Sie müssen die exit
Anweisung verwenden, um einen Ausgangscode aus einem Skript zurückzugeben. Standardmäßig gibt die exit
Anweisung zurück 0
. Sie können einen numerischen Wert angeben, um einen anderen Beendigungsstatus zurückzugeben. Ein Nichtzero-Beendigungscode signalisiert in der Regel einen Fehler.
Unter Windows ist eine beliebige Zahl zwischen [int]::MinValue
und [int]::MaxValue
ist zulässig.
Auf Unix sind nur positive Zahlen zwischen [byte]::MinValue
(0) und [byte]::MaxValue
(255) zulässig. Eine negative Zahl im Bereich von -1
durch -255
wird automatisch in eine positive Zahl übersetzt, indem 256 hinzugefügt wird. Beispiel: -2
wird in 254
.
In PowerShell legt die exit
Anweisung den Wert der $LASTEXITCODE
Variablen fest. In der Windows-Befehlsshell (cmd.exe) legt die Exit-Anweisung den Wert der %ERRORLEVEL%
Umgebungsvariable fest.
Jedes Argument, das nicht numerisch oder außerhalb des plattformspezifischen Bereichs ist, wird in den Wert von 0
übersetzt.
Skriptbereich und Punkt-Beschaffung
Jedes Skript wird in einem eigenen Bereich ausgeführt. Die Funktionen, Variablen, Aliase und Laufwerke, die im Skript erstellt werden, sind nur im Skriptbereich vorhanden. Sie können nicht auf diese Elemente oder deren Werte im Bereich zugreifen, in dem das Skript ausgeführt wird.
Wenn Sie ein Skript in einem anderen Bereich ausführen möchten, können Sie einen Bereich angeben, z. B. global oder lokal, oder Sie können das Skript mit punktieren.
Mit dem Dot Sourcing-Feature können Sie ein Skript im aktuellen Bereich anstelle des Skriptbereichs ausführen. Wenn Sie ein Skript ausführen, das punktiert ist, werden die Befehle im Skript so ausgeführt, als hätten Sie sie an der Eingabeaufforderung eingegeben. Die Funktionen, Variablen, Aliase und Laufwerke, die das Skript erstellt, werden in dem Bereich erstellt, in dem Sie arbeiten. Nachdem das Skript ausgeführt wurde, können Sie die erstellten Elemente verwenden und in Ihrer Sitzung auf deren Werte zugreifen.
Um ein Skript zu dotieren, geben Sie einen Punkt (.) und ein Leerzeichen vor dem Skriptpfad ein.
Zum Beispiel:
. C:\scripts\UtilityFunctions.ps1
oder
. .\UtilityFunctions.ps1
Nachdem das UtilityFunctions.ps1
Skript ausgeführt wurde, werden die vom Skript erstellten Funktionen und Variablen dem aktuellen Bereich hinzugefügt.
Beispielsweise erstellt das UtilityFunctions.ps1
Skript die New-Profile
Funktion und die $ProfileName
Variable.
#In UtilityFunctions.ps1
function New-Profile
{
Write-Host "Running New-Profile function"
$profileName = split-path $profile -leaf
if (test-path $profile)
{write-error "Profile $profileName already exists on this computer."}
else
{new-item -type file -path $profile -force }
}
Wenn Sie das UtilityFunctions.ps1
Skript in einem eigenen Skriptbereich ausführen, sind die New-Profile
Funktion und die $ProfileName
Variable nur vorhanden, während das Skript ausgeführt wird. Wenn das Skript beendet wird, werden die Funktion und Variable entfernt, wie im folgenden Beispiel gezeigt.
C:\PS> .\UtilityFunctions.ps1
C:\PS> New-Profile
The term 'new-profile' is not recognized as a cmdlet, function, operable
program, or script file. Verify the term and try again.
At line:1 char:12
+ new-profile <<<<
+ CategoryInfo : ObjectNotFound: (new-profile:String) [],
+ FullyQualifiedErrorId : CommandNotFoundException
C:\PS> $profileName
C:\PS>
Wenn Sie das Skript mit punktieren und ausführen, erstellt das Skript die New-Profile
Funktion und die $ProfileName
Variable in Ihrer Sitzung in Ihrem Bereich. Nachdem das Skript ausgeführt wurde, können Sie die New-Profile
Funktion in Ihrer Sitzung verwenden, wie im folgenden Beispiel gezeigt.
C:\PS> . .\UtilityFunctions.ps1
C:\PS> New-Profile
Directory: C:\Users\juneb\Documents\WindowsPowerShell
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 1/14/2009 3:08 PM 0 Microsoft.PowerShellISE_profile.ps1
C:\PS> $profileName
Microsoft.PowerShellISE_profile.ps1
Weitere Informationen zum Bereich finden Sie unter about_Scopes.
Skripts in Modulen
Ein Modul ist eine Reihe verwandter PowerShell-Ressourcen, die als Einheit verteilt werden können. Sie können Module verwenden, um Skripts, Funktionen und andere Ressourcen zu organisieren. Sie können auch Module verwenden, um Ihren Code an andere zu verteilen und Code aus vertrauenswürdigen Quellen abzurufen.
Sie können Skripts in Ihre Module einschließen oder ein Skriptmodul erstellen, bei dem es sich um ein Modul handelt, das vollständig oder hauptsächlich aus einem Skript und unterstützenden Ressourcen besteht. Ein Skriptmodul ist nur ein Skript mit der Dateierweiterung PSM1.
Weitere Informationen zu Modulen finden Sie unter about_Modules.
Weitere Skriptfeatures
PowerShell verfügt über viele nützliche Features, die Sie in Skripts verwenden können.
#Requires
– Sie können eine#Requires
Anweisung verwenden, um zu verhindern, dass ein Skript ohne bestimmte Module oder Snap-Ins und eine angegebene Version von PowerShell ausgeführt wird. Weitere Informationen finden Sie unter about_Requires.$PSCommandPath
- Enthält den vollständigen Pfad und namen des skripts, das ausgeführt wird. Dieser Parameter ist in allen Skripts gültig. Diese automatische Variable wird in PowerShell 3.0 eingeführt.$PSScriptRoot
- Enthält das Verzeichnis, aus dem ein Skript ausgeführt wird. In PowerShell 2.0 ist diese Variable nur in Skriptmodulen (.psm1
) gültig. Ab PowerShell 3.0 ist sie in allen Skripts gültig.$MyInvocation
- Die$MyInvocation
automatische Variable enthält Informationen zum aktuellen Skript, einschließlich Informationen darüber, wie sie gestartet oder "aufgerufen" wurde. Sie können diese Variable und die zugehörigen Eigenschaften verwenden, um Während der Ausführung Informationen zum Skript abzurufen. Beispiel: die$MyInvocation
. Die Variable "MyCommand.Path" enthält den Pfad und den Dateinamen des Skripts.$MyInvocation
. Zeile enthält den Befehl, der das Skript gestartet hat, einschließlich aller Parameter und Werte.Ab PowerShell 3.0 gibt es zwei neue Eigenschaften,
$MyInvocation
die Informationen zum Skript bereitstellen, das das aktuelle Skript aufgerufen oder aufgerufen hat. Die Werte dieser Eigenschaften werden nur aufgefüllt, wenn der Aufrufer oder Aufrufer ein Skript ist.PSCommandPath enthält den vollständigen Pfad und Namen des Skripts, das das aktuelle Skript aufgerufen oder aufgerufen hat.
PSScriptRoot enthält das Verzeichnis des Skripts, das das aktuelle Skript aufgerufen oder aufgerufen hat.
Im Gegensatz zu den
$PSCommandPath
und$PSScriptRoot
automatischen Variablen, die Informationen zum aktuellen Skript enthalten, enthalten die PSCommandPath - und PSScriptRoot-Eigenschaften der$MyInvocation
Variablen Informationen über das Skript, das das aktuelle Skript aufgerufen hat.Datenabschnitte – Sie können die
Data
Schlüsselwort (keyword) verwenden, um Daten aus der Logik in Skripts zu trennen. Datenabschnitte können auch die Lokalisierung vereinfachen. Weitere Informationen finden Sie unter about_Data_Sections und about_Script_Internationalization.Skriptsignatur – Sie können einem Skript eine digitale Signatur hinzufügen. Abhängig von der Ausführungsrichtlinie können Sie digitale Signaturen verwenden, um die Ausführung von Skripts einzuschränken, die unsichere Befehle enthalten können. Weitere Informationen finden Sie unter about_Execution_Policies und about_Signing.