Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 tramite 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 comando dir
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 i contenuti nell'unità C:
:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
può filtrare gli elementi con i parametri Path, Filter, Includee Exclude, ma di solito sono 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 effettuata 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 comando Test-Path
verifica se lo script del profilo esiste.
Se il file di destinazione esiste già, il tentativo di copia ha esito negativo. 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 file di .txt
contenuti in qualsiasi punto C:\data
in C:\temp\text
:
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à, non sovrascrivere o sostituire la cartella. Restituisce semplicemente l'oggetto cartella esistente. Tuttavia, se si utilizza 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 usando Remove-Item
, ma verrà richiesto di confermare la rimozione se l'elemento contiene altri elementi. 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 vuoi essere richiamato per ogni elemento contenuto, specifica il parametro Recurse.
Remove-Item -Path C:\temp\DeleteMe -Recurse
Mappare 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 root nella directory locale Program Files, visibile solo nella 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 Persistente.
Lettura di un file di testo in una matrice
Uno dei formati di archiviazione più comuni per i dati di testo si trova in un file con righe separate considerate come elementi di dati distinti. Il cmdlet Get-Content
può essere usato 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. Per confermare ciò, controllare la lunghezza 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 inserirli nella variabile $Computers
:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
è ora una matrice contenente un nome computer in ogni elemento.