about_Scripts
Breve descrizione
Viene descritto come eseguire e scrivere script in PowerShell.
Descrizione lunga
Uno script è un file di testo normale che contiene uno o più comandi di PowerShell.
Gli script di PowerShell hanno un'estensione .ps1
di file.
L'esecuzione di uno script è molto simile all'esecuzione di un cmdlet. Digitare il percorso e il nome file dello script e usare i parametri per inviare i dati e impostare le opzioni. È possibile eseguire script nel computer o in una sessione remota in un computer diverso.
La scrittura di uno script salva un comando per l'uso successivo e semplifica la condivisione con altri utenti. Più importante, consente di eseguire i comandi semplicemente digitando il percorso dello script e il nome file. Gli script possono essere semplici come un singolo comando in un file o come un programma complesso.
Gli script dispongono di funzionalità aggiuntive, ad esempio il commento speciale, l'uso #Requires
di parametri, il supporto per le sezioni dati e la firma digitale per la sicurezza.
È anche possibile scrivere argomenti della Guida per gli script e per qualsiasi funzione nello script.
Come eseguire uno script
Prima di poter eseguire uno script in Windows, è necessario modificare i criteri di esecuzione di PowerShell predefiniti. I criteri di esecuzione non si applicano a PowerShell in esecuzione in piattaforme non Windows.
Il criterio di esecuzione predefinito, Restricted
, impedisce l'esecuzione di tutti gli script, inclusi gli script scritti nel computer locale. Per altre informazioni, vedere about_Execution_Policies.
I criteri di esecuzione vengono salvati nel Registro di sistema, quindi è necessario modificarlo una sola volta in ogni computer.
Per modificare i criteri di esecuzione, usare la procedura seguente.
Al prompt dei comandi digitare:
Set-ExecutionPolicy AllSigned
oppure
Set-ExecutionPolicy RemoteSigned
La modifica è effettiva immediatamente.
Per eseguire uno script, digitare il nome completo e il percorso completo del file di script.
Ad esempio, per eseguire lo script Get-ServiceLog.ps1 nella directory C:\Script digitare:
C:\Scripts\Get-ServiceLog.ps1
Per eseguire uno script nella directory corrente, digitare il percorso della directory corrente oppure usare un punto per rappresentare la directory corrente, seguita da una barra rovesciata del percorso (.\
).
Ad esempio, per eseguire lo script ServicesLog.ps1 nella directory locale digitare:
.\Get-ServiceLog.ps1
Se lo script ha parametri, digitare i parametri e i valori dei parametri dopo il nome del file di script.
Ad esempio, il comando seguente usa il parametro ServiceName dello script Get-ServiceLog per richiedere un log dell'attività del servizio WinRM.
.\Get-ServiceLog.ps1 -ServiceName WinRM
Come funzionalità di sicurezza, PowerShell non esegue script quando si fa doppio clic sull'icona dello script in Esplora file o quando si digita il nome dello script senza un percorso completo, anche quando lo script si trova nella directory corrente. Per altre informazioni sull'esecuzione di comandi e script in PowerShell, vedere about_Command_Precedence.
Esecuzione con PowerShell
A partire da PowerShell 3.0, è possibile eseguire script da Esplora file.
Per usare la funzionalità "Esegui con PowerShell":
Eseguire Esplora file, fare clic con il pulsante destro del mouse sul nome del file di script e quindi scegliere "Esegui con PowerShell".
La funzionalità "Esegui con PowerShell" è progettata per eseguire script che non hanno parametri obbligatori e non restituiscono l'output al prompt dei comandi.
Per altre informazioni, vedere about_Run_With_PowerShell.
Esecuzione di script in altri computer
Per eseguire uno script in uno o più computer remoti, usare il parametro FilePath del Invoke-Command
cmdlet.
Immettere il percorso e il nome file dello script come valore del parametro FilePath . Lo script deve trovarsi nel computer locale o in una directory a cui il computer locale può accedere.
Il comando seguente esegue lo Get-ServiceLog.ps1
script nei computer remoti denominati Server01 e Server02.
Invoke-Command -ComputerName Server01,Server02 -FilePath `
C:\Scripts\Get-ServiceLog.ps1
Ottenere assistenza per gli script
Il cmdlet Get-Help ottiene gli argomenti della Guida per gli script, nonché per i cmdlet e altri tipi di comandi. Per ottenere l'argomento della Guida per uno script, digitare Get-Help
seguito dal percorso e dal nome file dello script. Se il percorso dello script si trova nella Path
variabile di ambiente, è possibile omettere il percorso.
Ad esempio, per ottenere assistenza per lo script ServicesLog.ps1, digitare:
get-help C:\admin\scripts\ServicesLog.ps1
Come scrivere uno script
Uno script può contenere tutti i comandi di PowerShell validi, inclusi i singoli comandi, i comandi che usano la pipeline, le funzioni e le strutture di controllo, ad esempio istruzioni If e cicli For.
Per scrivere uno script, aprire un nuovo file in un editor di testo, digitare i comandi e salvarli in un file con un nome file valido con l'estensione del .ps1
file.
L'esempio seguente è uno script semplice che ottiene i servizi in esecuzione nel sistema corrente e li salva in un file di log. Il nome del file di log viene creato dalla data corrente.
$date = (get-date).dayofyear
get-service | out-file "$date.log"
Per creare questo script, aprire un editor di testo o un editor di script, digitare questi comandi e salvarli in un file denominato ServiceLog.ps1
.
Parametri negli script
Per definire i parametri in uno script, usare un'istruzione Param. L'istruzione Param
deve essere la prima istruzione in uno script, ad eccezione di commenti e #Require
istruzioni.
I parametri di script funzionano come parametri di funzione. I valori dei parametri sono disponibili per tutti i comandi nello script. Tutte le funzionalità dei parametri di funzione, tra cui l'attributo Parameter e i relativi argomenti denominati, sono validi anche negli script.
Quando si esegue lo script, gli utenti dello script digitano i parametri dopo il nome dello script.
Nell'esempio seguente viene illustrato uno script con un Test-Remote.ps1
parametro ComputerName . Entrambe le funzioni di script possono accedere al valore del parametro ComputerName .
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}
Per eseguire questo script, digitare il nome del parametro dopo il nome dello script. Ad esempio:
C:\PS> .\test-remote.ps1 -computername Server01
Ping succeeded: Server01
Remote test failed: Server01
Per altre informazioni sull'istruzione Param e sui parametri della funzione, vedere about_Functions e about_Functions_Advanced_Parameters.
Scrittura della Guida per gli script
È possibile scrivere un argomento della Guida per uno script usando uno dei due metodi seguenti:
Guida Comment-Based per gli script
Creare un argomento della Guida usando parole chiave speciali nei commenti. Per creare una Guida basata su commenti per uno script, i commenti devono essere inseriti all'inizio o alla fine del file di script. Per altre informazioni sulla Guida basata sui commenti, vedere about_Comment_Based_Help.
Guida XML-Based per gli script
Creare un argomento della Guida basato su XML, ad esempio il tipo che viene in genere creato per i cmdlet. La Guida basata su XML è necessaria se si stanno traducendo gli argomenti della Guida in più lingue.
Per associare lo script all'argomento della Guida basata su XML, usare . Parola chiave del commento della Guida externalHelp. Per altre informazioni sulla parola chiave ExternalHelp, vedere about_Comment_Based_Help. Per altre informazioni sulla Guida basata su XML, vedere How to Write Cmdlet Help (Procedura per la scrittura del cmdlet).
Restituzione di un valore di uscita
Per impostazione predefinita, gli script non restituiscono uno stato di uscita al termine dello script. È necessario usare l'istruzione exit
per restituire un codice di uscita da uno script. Per impostazione predefinita, l'istruzione exit
restituisce 0
. È possibile specificare un valore numerico per restituire uno stato di uscita diverso. Un codice di uscita diverso da zero segnala in genere un errore.
In Windows è consentito qualsiasi numero tra [int]::MinValue
e [int]::MaxValue
.
In Unix sono consentiti solo numeri positivi tra [byte]::MinValue
(0) e [byte]::MaxValue
(255). Un numero negativo nell'intervallo -1
-255
di tramite viene convertito automaticamente in un numero positivo aggiungendo 256. Ad esempio, -2
viene trasformato in 254
.
In PowerShell l'istruzione exit
$LASTEXITCODE
imposta il valore della variabile. In Windows Command Shell (cmd.exe), l'istruzione %ERRORLEVEL%
exit imposta il valore della variabile di ambiente.
Qualsiasi argomento non numerico o esterno all'intervallo specifico della piattaforma viene convertito nel valore di 0
.
Ambito script e origine punti
Ogni script viene eseguito nel proprio ambito. Le funzioni, le variabili, gli alias e le unità create nello script esistono solo nell'ambito dello script. Non è possibile accedere a questi elementi o ai relativi valori nell'ambito in cui viene eseguito lo script.
Per eseguire uno script in un ambito diverso, è possibile specificare un ambito, ad esempio Global o Local, oppure è possibile dotare lo script.
La funzionalità dot sourcing consente di eseguire uno script nell'ambito corrente anziché nell'ambito dello script. Quando si esegue uno script con origine dot, i comandi nello script vengono eseguiti come se fossero stati digitati al prompt dei comandi. Le funzioni, le variabili, gli alias e le unità create dallo script vengono create nell'ambito in cui si sta lavorando. Dopo l'esecuzione dello script, è possibile usare gli elementi creati e accedere ai relativi valori nella sessione.
Per aggiungere un punto a uno script, digitare un punto (.) e uno spazio prima del percorso dello script.
Ad esempio:
. C:\scripts\UtilityFunctions.ps1
o
. .\UtilityFunctions.ps1
Dopo l'esecuzione dello UtilityFunctions.ps1
script, le funzioni e le variabili create dallo script vengono aggiunte all'ambito corrente.
Ad esempio, lo UtilityFunctions.ps1
script crea la funzione e la $ProfileName
New-Profile
variabile.
#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 }
}
Se si esegue lo UtilityFunctions.ps1
script nel proprio ambito di script, la funzione e la $ProfileName
New-Profile
variabile esistono solo durante l'esecuzione dello script. Quando lo script viene chiuso, la funzione e la variabile vengono rimosse, come illustrato nell'esempio seguente.
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>
Quando si dota lo script ed eseguirlo, lo script crea la funzione e la New-Profile
$ProfileName
variabile nella sessione nell'ambito. Dopo l'esecuzione dello script, è possibile usare la New-Profile
funzione nella sessione, come illustrato nell'esempio seguente.
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
Per altre informazioni sull'ambito, vedere about_Scopes.
Script nei moduli
Un modulo è un set di risorse di PowerShell correlate che possono essere distribuite come unità. È possibile usare moduli per organizzare gli script, le funzioni e altre risorse. È anche possibile usare moduli per distribuire il codice ad altri e ottenere codice da origini attendibili.
È possibile includere script nei moduli oppure creare un modulo di script, ovvero un modulo costituito interamente o principalmente da uno script e risorse di supporto. Un modulo script è solo uno script con estensione psm1.
Per altre informazioni sui moduli, vedere about_Modules.
Altre funzionalità di script
PowerShell offre molte funzionalità utili che è possibile usare negli script.
#Requires
- È possibile usare un'istruzione per impedire l'esecuzione di uno#Requires
script senza moduli o snap-in specificati e una versione specificata di PowerShell. Per altre informazioni, vedere about_Requires.$PSCommandPath
- Contiene il percorso completo e il nome dello script in esecuzione. Questo parametro è valido in tutti gli script. Questa variabile automatica viene introdotta in PowerShell 3.0.$PSScriptRoot
- Contiene la directory da cui viene eseguito uno script. In PowerShell 2.0 questa variabile è valida solo nei moduli di script (.psm1
). A partire da PowerShell 3.0, è valido in tutti gli script.$MyInvocation
- La$MyInvocation
variabile automatica contiene informazioni sullo script corrente, incluse informazioni su come è stato avviato o "richiamato". È possibile usare questa variabile e le relative proprietà per ottenere informazioni sullo script durante l'esecuzione. Ad esempio, .$MyInvocation
La variabile MyCommand.Path contiene il percorso e il nome file dello script.$MyInvocation
. La riga contiene il comando che ha avviato lo script, inclusi tutti i parametri e i valori.A partire da PowerShell 3.0,
$MyInvocation
sono disponibili due nuove proprietà che forniscono informazioni sullo script che ha chiamato o richiamato lo script corrente. I valori di queste proprietà vengono popolati solo quando il chiamante o il chiamante è uno script.PSCommandPath contiene il percorso completo e il nome dello script che ha chiamato o richiamato lo script corrente.
PSScriptRoot contiene la directory dello script che ha chiamato o richiamato lo script corrente.
A differenza delle
$PSCommandPath
variabili e$PSScriptRoot
automatiche, che contengono informazioni sullo script corrente, le proprietà PSCommandPath e PSScriptRoot della$MyInvocation
variabile contengono informazioni sullo script che ha chiamato lo script corrente.Sezioni dati: è possibile usare la
Data
parola chiave per separare i dati dalla logica negli script. Le sezioni dei dati possono anche semplificare la localizzazione. Per altre informazioni, vedere about_Data_Sections e about_Script_Internationalization.Firma script: è possibile aggiungere una firma digitale a uno script. A seconda dei criteri di esecuzione, è possibile usare firme digitali per limitare l'esecuzione di script che potrebbero includere comandi non sicuri. Per altre informazioni, vedere about_Execution_Policies e about_Signing.