PowerShellIntroduzione a PowerShell


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:

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

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.

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

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
 

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
 

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.

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

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.