PowerShell Tutorial
Introduzione a PowerShell
Ricerca…
Osservazioni
Windows PowerShell è un componente di shell e script di Windows Management Framework, un framework di gestione di automazione / configurazione di Microsoft basato su .NET Framework. PowerShell viene installato per impostazione predefinita su tutte le versioni supportate dei sistemi operativi client e server Windows da Windows 7 / Windows Server 2008 R2. Powershell può essere aggiornato in qualsiasi momento scaricando una versione successiva di Windows Management Framework (WMF). La versione "Alpha" di PowerShell 6 è multipiattaforma (Windows, Linux e OS X) e deve essere scaricata e installata da questa pagina di rilascio .
Risorse addizionali:
- Documentazione MSDN: https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- Galleria PowerShell: https://www.powershellgallery.com/
- Blog MSDN: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Sito comunitario: http://powershell.com/cs/
Versioni
Versione | Incluso con Windows | Gli appunti | Data di rilascio |
---|---|---|---|
1.0 | XP / Server 2008 | 2006-11-01 | |
2.0 | 7 / Server 2008 R2 | 2009-11-01 | |
3.0 | 8 / Server 2012 | 2012-08-01 | |
4.0 | 8.1 / Server 2012 R2 | 2013/11/01 | |
5.0 | 10 / Server 2016 Tech Preview | 2015/12/16 | |
5.1 | 10 Anniversary edition / Server 2016 | 2017/01/27 |
Installazione o configurazione
finestre
PowerShell è incluso in Windows Management Framework. L'installazione e l'installazione non sono richieste sulle versioni moderne di Windows.
Gli aggiornamenti a PowerShell possono essere eseguiti installando una versione più recente di Windows Management Framework.
Altre piattaforme
La versione "Beta" di PowerShell 6 può essere installata su altre piattaforme. I pacchetti di installazione sono disponibili qui .
Ad esempio, PowerShell 6, per Ubuntu 16.04, viene pubblicato per il pacchetto di repository per una facile installazione (e aggiornamenti).
Per installare eseguire quanto segue:
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
Dopo aver registrato il repository Microsoft una volta come superutente, da quel momento in poi, sarà sufficiente utilizzare sudo apt-get upgrade powershell
per aggiornarlo. Quindi esegui powershell
Permetti agli script memorizzati sul tuo computer di essere eseguiti senza firma
Per motivi di sicurezza, PowerShell è configurato per impostazione predefinita per consentire solo l'esecuzione di script firmati. L'esecuzione del comando seguente consentirà di eseguire script non firmati (per eseguire questa operazione è necessario eseguire PowerShell come amministratore).
Set-ExecutionPolicy RemoteSigned
Un altro modo per eseguire script PowerShell consiste nell'utilizzare Bypass
come ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
Oppure dalla tua console PowerShell o sessione ISE esistente eseguendo:
Set-ExecutionPolicy Bypass Process
È inoltre possibile eseguire una soluzione temporanea per i criteri di esecuzione eseguendo l'eseguibile di PowerShell e passando qualsiasi criterio valido come parametro -ExecutionPolicy
. Il criterio è valido solo durante la vita del processo, quindi non è necessario alcun accesso amministrativo al registro.
C:\>powershell -ExecutionPolicy RemoteSigned
Sono disponibili più altre politiche e i siti online spesso incoraggiano l'utilizzo di Set-ExecutionPolicy Unrestricted
. Questa politica rimane in vigore fino a quando non viene modificata e riduce la sicurezza del sistema. Questo non è consigliabile. L'uso di RemoteSigned
è consigliato perché consente il codice memorizzato e scritto localmente e richiede che il codice acquisito a distanza venga firmato con un certificato da una radice attendibile.
Inoltre, fare attenzione che la politica di esecuzione possa essere applicata dai Criteri di gruppo, in modo che, anche se la politica viene modificata su Non Unrestricted
sistema, i Criteri di gruppo possono ripristinare tale impostazione al successivo intervallo di applicazione (in genere 15 minuti). È possibile visualizzare il criterio di esecuzione impostato nei vari ambiti utilizzando Get-ExecutionPolicy -List
Documentazione TechNet:
Set-ExecutionPolicy
about_Execution_Policies
Alias e funzioni simili
In PowerShell, ci sono molti modi per ottenere lo stesso risultato. Questo può essere illustrato bene con l'esempio Hello World
semplice e familiare:
Utilizzando l' Write-Host
:
Write-Host "Hello World"
Uso di Write-Output
:
Write-Output 'Hello world'
Vale la pena notare che anche se Write-Output
e Write-Host
scrivono entrambi sullo schermo c'è una sottile differenza. Write-Host
scrive solo su stdout (cioè sullo schermo della console), mentre Write-Output
scrive sia su stdout AND sul flusso di output [successo] che consente il reindirizzamento . Il reindirizzamento (e gli stream in generale) consentono di indirizzare l'output di un comando come input a un altro incluso l'assegnazione a una variabile.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Queste funzioni simili non sono alias, ma possono produrre gli stessi risultati se si vuole evitare di "inquinare" il flusso di successo.
Write-Output
è aliasto in Echo
o Write
Echo 'Hello world'
Write 'Hello world'
Oppure, semplicemente digitando "Hello world"!
'Hello world'
Tutto ciò si tradurrà nell'output della console previsto
Hello world
Un altro esempio di alias in PowerShell è rappresentato dalla mappatura comune di comandi e comandi BASH del comando precedenti e dei cmdlet di PowerShell. Tutti i seguenti producono un elenco di directory della directory corrente.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Infine, puoi creare il tuo alias con il cmdlet Set-Alias! Ad esempio, Test-NetConnection
, che è essenzialmente l'equivalente di PowerShell al comando ping del prompt dei comandi, a "ping".
Set-Alias -Name ping -Value Test-NetConnection
Ora puoi usare ping
invece di Test-NetConnection
! Tieni presente che se l'alias è già in uso, sovrascrivi l'associazione.
L'alias sarà vivo finché la sessione non sarà attiva. Una volta che si chiude la sessione e si tenta di eseguire l'alias creato nell'ultima sessione, non funzionerà. Per superare questo problema, puoi importare tutti i tuoi alias da un excel nella tua sessione una volta, prima di iniziare il tuo lavoro.
La pipeline: utilizzo dell'output da un cmdlet di PowerShell
Una delle prime domande che gli utenti hanno quando iniziano a utilizzare PowerShell per lo scripting è come manipolare l'output da un cmdlet per eseguire un'altra azione.
Il simbolo del gasdotto |
viene utilizzato alla fine di un cmdlet per raccogliere i dati che esporta e alimentarlo al cmdlet successivo. Un semplice esempio utilizza Select-Object per mostrare solo la proprietà Name di un file mostrato da Get-ChildItem:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
L'utilizzo più avanzato della pipeline ci consente di convogliare l'output di un cmdlet in un ciclo foreach:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Si noti che l'esempio sopra utilizza la variabile automatica $ _. $ _ è l'alias breve di $ PSItem che è una variabile automatica che contiene l'elemento corrente nella pipeline.
Commentando
Per commentare gli script di potenza, anteporre la riga usando il simbolo #
(cancelletto)
# This is a comment in powershell
Get-ChildItem
Puoi anche avere commenti su più righe usando rispettivamente <#
e #>
all'inizio e alla fine del commento.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Chiamare i metodi della libreria .Net
I metodi della libreria statica .Net possono essere richiamati da PowerShell incapsulando il nome completo della classe nella terza parentesi e chiamando il metodo utilizzando ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
I metodi statici possono essere chiamati dalla classe stessa, ma i metodi non statici richiedono un'istanza della classe .Net (un oggetto).
Ad esempio, il metodo AddHours non può essere chiamato dalla classe System.DateTime. Richiede un'istanza della classe:
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
In questo caso, per prima cosa creiamo un oggetto , ad esempio:
C:\> $Object = [System.DateTime]::Now
Quindi, possiamo usare i metodi di quell'oggetto, anche i metodi che non possono essere chiamati direttamente dalla classe System.DateTime, come il metodo AddHours:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Creazione di oggetti
Il cmdlet New-Object
viene utilizzato per creare un oggetto.
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
In molti casi, verrà creato un nuovo oggetto per esportare i dati o passarli a un altro comando. Questo può essere fatto in questo modo:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Esistono molti modi per creare un oggetto. Il seguente metodo è probabilmente il modo più breve e veloce per creare un oggetto PSCustomObject
:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Se hai già un oggetto, ma hai solo bisogno di una o due proprietà extra, puoi semplicemente aggiungere quella proprietà usando Select-Object
:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Tutti gli oggetti possono essere memorizzati in variabili o passati nella pipeline. È inoltre possibile aggiungere questi oggetti a una raccolta e quindi mostrare i risultati alla fine.
Le raccolte di oggetti funzionano bene con Export-CSV (e Import-CSV). Ogni riga del CSV è un oggetto, ogni colonna una proprietà.
I comandi di formattazione convertono oggetti in flussi di testo per la visualizzazione. Evita di usare i comandi Format- * fino al passaggio finale di qualsiasi elaborazione dati, per mantenere l'usabilità degli oggetti.