Esempi PowerShell

Riprendiamo il tema PowerShell e vediamo alcuni esempi chiassosi, roba da poche righe ma d'effetto.

Start-Transcript -Path c:\temp\transcript.ps1

Genera uno script con i comandi che via via si digitano interattivamente.

$user = [ADSI]"WinNT://./Administrator,user"

$user.description

Legge la descrizione dell'utente Administrator mediante ADSI.

(320gb*425)/1000GB

GB e MB son unità di misura predefinite… purtroppo solo queste.

([DateTime]::Now - ([DateTime]"1964-11-24")).Days

Quanti giorni ho oggi?

dir -include *.vbs, *.ps1, *.bat -recurse | Group-Object extension –noelement

Quanti file con script di comando (cioè VBS, PS1 e BAT) ho?

(dir | where {$_.name -like '*.docx'}).count

Quanti file DOCX ci sono in questa cartella?

Get-WmiObject IisWebService -namespace "root\MicrosoftIISv2"

L'oggetto WMI che rappresenta IIS.

Get-ChildItem | Measure-Object -property length -sum -max -min –average

Dimensione dei file nella cartella: compresa somma, minimo, massimo e media.

$rssUrl = "https://blogs.msdn.com/giuliov/rss.aspx"

$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)

$blog.rss.channel.item | select title -first 8

Gli 8 post più recenti del mio blog.

$url = "https://files.skyscrapr.net/users/arcast/ARCast20061113-ScottGu.mp3"

$file = "D:\Downloads\PodCast\ARCast - Scott Guthrie - the man, the myth, the legend.mp3"

$clnt = new-object System.Net.WebClient

$clnt.DownloadFile($url,$file)

Scarica un file da Internet.

gc test.txt | Measure-Object -Character -Word –Line

Word count (wc) sul file test.txt!

cd "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

New-ItemProperty -Path . -Name ProxyEnable -PropertyType DWord -Value 0 –Force

Disabilita il proxy per Internet Explorer modificando il registry.

cd "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

New-ItemProperty -Path . -Name ProxyEnable -PropertyType DWord -Value 1 -Force

New-ItemProperty -Path . -Name ProxyServer -PropertyType String -Value "myproxy:80" -Force

New-ItemProperty -Path . -Name ProxyOverride -PropertyType String -Value "*.local;<local>" –Force

Definisce un proxy per Internet Explorer, sempre agendo sul registry.

$a,$b = $b,$a

Scambia il valore di due variabili (swap).

@"

quiet 0 25

normal 26 50

loud 51 75

noisy 75 100

"@ > data.txt

$data = Get-Content data.txt | foreach {

$e=@{}

$e.level, [int] $e.lower, [int] $e.upper = $_.split()

$e

}

Costruisce un dizionario di intervalli.

($data | where { ($_.lower -lt 50) -and ($_.upper -ge 50) }).level

Uso del dizionario per vedere in che intervallo cade il valore 50.

(1,2,3)[-1]

Prende l'ultimo elemento del vettore (-2 è il penultimo, ecc.).

$prop = "length"; "Hello world".$prop

Richiamo di una proprietà per nome.

# capture the output objects in $output and the error objects in $error

$error = $( $output = myScript ) 2>&1

Come catturare in due variabili sia gli oggetti di output che quelli di errore.

myScript > file.txt

# syntactic sugar for

myScript | Out-File –path file.txt

La redirezione dell'output è in effetti un uso convenzionale della pipeline.

$id = [System.Security.Principal.WindowsIdentity]::GetCurrent()

$p = New-Object System.Security.Principal.WindowsPrincipal($id)

if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))

{

    $Host.UI.RawUI.WindowTitle = "Administrator: " + $Host.UI.RawUI.WindowTitle

}

Cambia il titolo della console per indicare se sta girando con i privilegi amministrativi (utile se inserito nel profile script, ad es. Microsoft.PowerShell_profile.ps1).

# disable UAC

cd HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies

Set-ItemProperty -Path . -Name ConsentPromptBehaviorAdmin -Value 0

Disabilita UAC… ovviamente se la shell PS sta girando con i privilegi amministrativi.

Remove-Item Alias:dir

function dir {cmd /c dir $args}

Ripristinare il comando dir originale di CMD.EXE rimuovendo l'alias di PS che esegue il cmdlet Get-ChildItem.