Condividi tramite


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\textC:\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.