Le operazioni di spostamento tra unità Windows PowerShell e di gestione degli elementi in esse disponibili sono analoghe a quelle di gestione di file e cartelle in unità disco fisiche di Windows. In questa sezione verrà spiegato come eseguire specifiche attività di modifica di file e cartelle.
Visualizzazione dell'elenco di tutti i file e di tutte le cartelle presenti in una cartella
Per visualizzare direttamente tutti gli elementi presenti in una cartella, è possibile utilizzare Get-ChildItem. Aggiungere il parametro facoltativo Force per visualizzare elementi nascosti o di sistema. Questo comando consente ad esempio di visualizzare il contenuto diretto dell'unità C di Windows PowerShell, che corrisponde all'unità C fisica di Windows:
Get-ChildItem -Force C:\
Il comando consente di visualizzare solo gli elementi contenuti in modo diretto, come quando si utilizza il comando DIR di Cmd.exe o ls in una shell UNIX. Per poter visualizzare gli elementi contenuti, è necessario specificare anche il parametro -Recurse. Con questo parametro il completamento dell'operazione può tuttavia richiedere un tempo prolungato. Per un elenco di tutti gli elementi presenti nell'unità C, digitare:
Get-ChildItem -Force C:\ -Recurse
È possibile utilizzare Get-ChildItem per filtrare gli elementi con i parametri Path, Filter, Include ed Exclude, ma questi sono in genere basati solo sul nome. Per eseguire operazioni di filtro complesse basate su altre proprietà degli elementi, è possibile utilizzare Where-Object.
Il comando seguente consente di trovare tutti gli eseguibili inclusi nella cartella Programmi la cui data di modifica è successiva al 1° ottobre 2005 e le cui dimensioni sono maggiori di 1 MB e minori di 10 MB:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
Copia di file e cartelle
Per la copia viene utilizzato Copy-Item. Il comando seguente consente di eseguire il backup di C:\boot.ini in C:\boot.bak:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak
Se il file di destinazione è già esistente, il tentativo di copia non riuscirà. Per sovrascrivere una destinazione preesistente, utilizzare il parametro Force:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force
Questo comando è valido anche la destinazione è di sola lettura.
Il processo di copia delle cartelle è analogo. Questo comando consente di copiare la cartella C:\temp\test1 nella nuova cartella c:\temp\DeleteMe in modo ricorsivo:
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe
È inoltre possibile copiare solo alcuni elementi selezionati. Il comando seguente consente di copiare tutti i file con estensione txt inclusi in tutte le directory comprese tra c:\data e c:\temp\text:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text
Per eseguire copie del file system, è comunque possibile utilizzare altri strumenti. È possibile utilizzare in Windows PowerShell gli oggetti XCOPY, ROBOCOPY e COM, ad esempio Scripting.FileSystemObject,. Ad esempio, è possibile utilizzare la classe Scripting.FileSystem COM di Windows Script Host per eseguire il backup di C:\boot.ini in C:\boot.bak:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")
Creazione di file e cartelle
Il processo di creazione di nuovi elementi è identico per tutti i provider di Windows PowerShell. Se per un provider di Windows PowerShell è disponibile più di un tipo di elemento, come nel caso del provider FileSystem che fa distinzione tra directory e file, sarà necessario specificare il tipo dell'elemento.
Questo comando consente di creare una nuova cartella denominata C:\temp\New Folder:
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"
Questo comando consente di creare un nuovo file vuoto denominato C:\temp\New Folder\file.txt:
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"
Rimozione di tutti i file e di tutte le cartelle presenti in una cartella
È possibile rimuovere elementi contenuti utilizzando Remove-Item, ma verrà richiesto di confermare la rimozione se l'elemento contiene altri elementi. Se ad esempio si tenta di eliminare la cartella C:\temp\DeleteMe che contiene altri elementi, verrà richiesto di confermare l'eliminazione della cartella:
Remove-Item C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe has children and the -recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Se non si desidera visualizzare la richiesta di conferma per ogni elemento contenuto, specificare il parametro Recurse:
Remove-Item C:\temp\DeleteMe -Recurse
Mapping di una cartella locale come unità di rete accessibile da Windows
È inoltre possibile eseguire il mapping di una cartella locale utilizzando il comando subst. Con il comando seguente viene creata un'unità locale P: la cui radice si trova nella directory Programmi locale:
subst p: $env:programfiles
Come per le unità di rete, le unità mappate in Windows PowerShell tramite subst sono immediatamente visibili nella shell di Windows PowerShell.
Lettura di un file di testo in una matrice
Uno di formati di archiviazione più comuni per i dati di testo è costituito da un file contenente righe considerate come elementi di dati distinti. È possibile utilizzare il cmdlet Get-Content per leggere un intero file con un'unica operazione, come illustrato di seguito:
PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content considera già i dati letti dai file come una matrice, con un elemento per ciascuna riga del contenuto del file. Per verificare questa situazione, verificare Length del contenuto restituito:
PS> (Get-Content -Path C:\boot.ini).Length 6
Questo comando risulta maggiormente utile per ottenere elenchi di informazioni direttamente in Windows PowerShell. È ad esempio possibile archiviare un elenco di nomi di computer o indirizzi IP in un file denominato C:\temp\domainMembers.txt, contenente un solo nome per ciascuna riga del file. È possibile utilizzare Get-Content per recuperare il contenuto del file e inserirlo nella variabile $Computers:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers corrisponde a una matrice contenente un nome di computer in ogni elemento.