Utilizzo di file e cartelle
Lo spostamento tra le unità di PowerShell e la modifica degli elementi in essi contenuti è simile alla modifica di file e cartelle nelle unità disco di Windows. Questo articolo illustra come gestire attività specifiche di manipolazione di file e cartelle usando PowerShell.
Elenco di tutti i file e le cartelle all'interno di una cartella
È possibile ottenere tutti gli elementi direttamente all'interno di una cartella usando Get-ChildItem
. Aggiungere il parametro facoltativo Force per visualizzare elementi nascosti o di sistema. Ad esempio, questo comando visualizza il contenuto diretto di PowerShell Drive C:
.
Get-ChildItem -Path C:\ -Force
Il comando elenca solo gli elementi contenuti direttamente, in modo analogo all'uso del dir
comando in cmd.exe
o ls
in una shell UNIX. Per visualizzare gli elementi nella sottocartella, è necessario specificare il parametro Recurse .
Il comando seguente elenca tutti gli elementi nell'unità C:
:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
consente di filtrare gli elementi tramite i parametri Path, Filter, Include ed Exclude, ma questi parametri sono solitamente basati solo sul nome. È possibile eseguire filtri complessi in base ad altre proprietà degli elementi usando Where-Object
.
Il comando seguente trova tutti i file eseguibili all'interno della cartella Programmi che sono stati modificati per l'ultima volta dopo il 1° ottobre 2005 e che non sono più piccoli di 1 megabyte né più grandi di 10 megabyte:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
Where-Object -FilterScript {
($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
}
Copia di file e cartelle
La copia viene eseguita con Copy-Item
. Il comando seguente esegue il backup dello script del profilo di PowerShell:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}
Il Test-Path
comando controlla se lo script del profilo esiste.
Se il file di destinazione esiste già, il tentativo di copia non riesce. Per sovrascrivere una destinazione preesistente, usare il parametro Force:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}
Questo comando funziona anche quando la destinazione è di sola lettura.
La copia di cartelle funziona allo stesso modo. Questo comando copia la cartella C:\temp\test1
nella nuova cartella C:\temp\DeleteMe
in modo ricorsivo:
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
È anche possibile copiare una selezione di elementi. Il comando seguente copia tutti i .txt
file contenuti ovunque in C:\temp\text
C:\data
:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
È comunque possibile eseguire comandi nativi come xcopy.exe
e robocopy.exe
per copiare i file.
Creazione di file e cartelle
La creazione di nuovi elementi funziona allo stesso modo in tutti i provider di PowerShell. Se un provider di PowerShell ha più di un tipo di elemento, ad esempio il provider PowerShell FileSystem distingue tra directory e file, è necessario specificare il tipo di elemento.
Questo comando crea una nuova cartella C:\temp\New Folder
:
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
Questo comando crea un nuovo file vuoto C:\temp\New Folder\file.txt
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File
Importante
Quando si usa l'opzione Force con il comando New-Item
per creare una cartella e la cartella esiste già, la cartella non verrà sovrascritta o sostituita. Verrà semplicemente restituito l'oggetto cartella esistente. Tuttavia, se si usa New-Item -Force
in un file già esistente, il file viene sovrascritto.
Rimozione di tutti i file e le cartelle all'interno di una cartella
È possibile rimuovere gli elementi contenuti tramite Remove-Item
, ma verrà richiesto di confermare la rimozione se l'elemento ne contiene altri. Ad esempio, se si tenta di eliminare la cartella C:\temp\DeleteMe
che contiene altri elementi, PowerShell chiede conferma prima di eliminare la cartella:
Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
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 vuole richiedere ogni elemento contenuto, specificare il parametro Recurse :
Remove-Item -Path C:\temp\DeleteMe -Recurse
Mapping di una cartella locale come unità
È anche possibile eseguire il mapping di una cartella locale, usando il comando New-PSDrive
. Il comando seguente crea un'unità locale P:
con radice nella directory Programmi locale, visibile solo dalla sessione di PowerShell:
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
Come per le unità di rete, le unità mappate all'interno di PowerShell sono immediatamente visibili alla shell di PowerShell. Per creare un'unità mappata visibile da Esplora file, usare il parametro Persist. Tuttavia, solo i percorsi remoti possono essere usati con Persist.
Lettura di un file di testo in una matrice
Uno dei formati di archiviazione più comuni per i dati di testo è un file con righe separate considerate come elementi di dati distinti. È possibile usare il cmdlet Get-Content
per leggere un intero file in un unico passaggio, come illustrato di seguito:
Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs
Get-Content
considera i dati letti dal file come matrice, con un elemento per riga di contenuto del file. È possibile verificarlo controllando il valore Length del contenuto restituito:
PS> (Get-Content -Path $PROFILE).Length
3
Questo comando è più utile per ottenere elenchi di informazioni in PowerShell. Ad esempio, è possibile archiviare un elenco di nomi di computer o indirizzi IP nel file C:\temp\domainMembers.txt
, con un nome in ogni riga del file. È possibile usare Get-Content
per recuperare il contenuto del file e inserirlo nella variabile $Computers
:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
è ora una matrice contenente un nome computer in ogni elemento.