Script, profili ed Execution Policy
Come scrivere, avviare e proteggere gli script PowerShell.
Creare ed eseguire uno script
Salva un file con estensione .ps1, ad esempio saluto.ps1:
param(
[string]$Nome = "mondo"
)
Write-Host "Ciao $Nome"
Eseguirlo:
.\saluto.ps1
.\saluto.ps1 -Nome Michele
& "C:\Script\mio script.ps1"
Il .\ è obbligatorio per i file della cartella corrente. Con spazi nel percorso serve l'operatore di chiamata &.
Da CMD o dal menu Start:
powershell -NoProfile -ExecutionPolicy Bypass -File C:\Script\saluto.ps1
Execution Policy
Determina quali script possono essere eseguiti. Non è un confine di sicurezza (si aggira facilmente) ma una protezione contro esecuzioni accidentali.
Get-ExecutionPolicy
Get-ExecutionPolicy -List
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
| Policy | Comportamento |
|---|---|
Restricted | Nessuno script (predefinito nei client Windows) |
AllSigned | Solo script firmati |
RemoteSigned | Script locali liberi, quelli scaricati devono essere firmati |
Unrestricted | Tutto, con avviso per gli script scaricati |
Bypass | Nessun blocco né avviso |
Per un uso quotidiano, RemoteSigned su CurrentUser è una buona scelta e non richiede privilegi di amministratore.
Per un singolo avvio senza modificare la policy:
powershell -ExecutionPolicy Bypass -File .\script.ps1
I criteri di gruppo possono sovrascrivere le impostazioni locali (MachinePolicy e UserPolicy nell'elenco).
Sbloccare file scaricati
I file da Internet portano un marcatore "Mark of the Web":
Unblock-File .\script.ps1
Get-ChildItem .\Script -Recurse | Unblock-File
Eseguire come amministratore
Se lo script lo richiede:
#Requires -RunAsAdministrator
Oppure auto-elevazione:
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Start-Process powershell -Verb RunAs -ArgumentList "-NoProfile -File `"$PSCommandPath`""
exit
}
Direttive utili
#Requires -Version 7.0
#Requires -Modules ActiveDirectory
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Parametri di uno script
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$Percorso,
[switch]$Ricorsivo
)
if ($Ricorsivo) { Get-ChildItem $Percorso -Recurse } else { Get-ChildItem $Percorso }
-Verbose e -WhatIf si possono aggiungere con [CmdletBinding(SupportsShouldProcess)].
Output e log
Write-Host "Messaggio a schermo" -ForegroundColor Green
Write-Output "Dati nella pipeline"
Write-Verbose "Dettaglio"
Write-Warning "Attenzione"
Write-Error "Errore"
Start-Transcript -Path C:\Log\sessione.txt
Stop-Transcript
Usa Write-Output per i dati restituibili e Write-Host solo per messaggi all'utente.
Il profilo
Script eseguito a ogni avvio della console:
$PROFILE
Test-Path $PROFILE
New-Item -ItemType File -Path $PROFILE -Force
notepad $PROFILE
Esempio di contenuto:
Set-Alias np notepad
function ll { Get-ChildItem -Force | Format-Table -AutoSize }
Set-PSReadLineOption -PredictionSource History
Ricarica il profilo con . $PROFILE.
Moduli
Get-Module
Get-Module -ListAvailable
Import-Module ActiveDirectory
Install-Module -Name PSReadLine -Scope CurrentUser
Find-Module *Azure*
Update-Module
Install-Module scarica da PowerShell Gallery (ti chiederà di fidarti del repository). In PowerShell 7 esiste anche Install-PSResource.
Debug
Set-PSDebug -Trace 1
Set-PSDebug -Off
Set-Breakpoint -Script .\script.ps1 -Line 10
Get-PSBreakpoint
Remove-PSBreakpoint
Il debugger integrato di Visual Studio Code con l'estensione PowerShell è il modo più comodo di eseguire passo passo gli script.