PowerShell – Gestione del File System
Proseguiamo il nostro viaggio con PowerShell andando a vedere come eseguire operazioni comuni sul filesystem. Avete già letto PowerShell – Introduzione?
Comandi Fondamentali per Esplorare il Filesystem
Visualizzare la posizione corrente: Get-Location (alias: pwd)
Il primo step è capire dove siamo nel filesystem. Possiamo usare due comandi:
Get-Location oppure pwd (di derivazione *nix):

Figura 1: dove sono?
Cambiare cartella: Set-Location (alias: cd)
Anche per cambiare cartella possiamo usare due comandi:
Set-Location Oppure (con tanta fantasia…) CD
Possiamo usare tutte le scorciatoie che siamo abituati ad usare:
|
1 2 3 4 5 6 7 8 |
Set-Location.. Set-Location Path Set-Location ~ |

Figura 2: cambio cartella
Elencare file e cartelle: Get-ChildItem (alias: ls, dir)
Qui invece abbiamo addirittura e opzioni: Get-ChildItem, ls o dir
In particolare, Get-ChildItem ha alcune opzioni interessanti
Mostra file e cartelle con dettagli
|
1 2 3 4 5 |
Get-ChildItem -Attributes D # Solo cartelle Get-ChildItem -Attributes !D # Solo file (non cartelle) |
Mostra file nascosti
|
1 2 |
Get-ChildItem -Force |
Mostra ricorsivamente tutte le sottocartelle
|
1 2 |
Get-ChildItem -Recurse |
Mostra solo file con estensione .txt
|
1 2 |
Get-ChildItem -Filter "*.txt" |
Mostra solo i file di testo nella cartella e in tutte le sottocartelle
|
1 2 |
Get-ChildItem -Path .\*.txt -Recurse -Force |

Figura 3.

Figura 4: opzioni interessanti di Get-ChildItem
Creare File e Cartelle: New-Item
Il cmdlet New-Item consente di creare oggetti (file, cartelle, Chiavi di registro).
La sintassi è: New-Item [-Path] <string> [-Name] <string> [-ItemType] <string> [-Value <Object>] [-Force] [-Credential <pscredential>] [-WhatIf] [-Confirm] [<CommonParameters>]
Parametri di New-Item
| Parametro | Descrizione |
| -Path | Specifica il percorso in cui verrà creato il nuovo elemento. |
| -Name | Specifica il nome del nuovo elemento. |
| -ItemType | Specifica il tipo di elemento da creare (es. file, directory, chiave di registro). |
| -Value | Imposta il valore del nuovo elemento. |
| -Force | Forza il cmdlet a creare l’elemento anche se esiste già. |
| -Credential | Specifica l’account utente che ha il permesso di eseguire questa azione. |
| -WhatIf | Mostra cosa succederebbe se il cmdlet venisse eseguito. |
| -Confirm | Richiede conferma prima di eseguire il cmdlet. |
Il parametro -ItemType è particolare: Se fa riferimento al FileSystem può contenere questi valori: File, Directory, SymbolicLink, HardLink e Junction; se punta ai Certificati, può essere: Certificate Provider, Certificate. Store e StoreLocation.
Attenzione al -Force: il parametro Force sovrascrive l’oggetto esistente! sia che sia un file sia una cartella, sia una registry key
Creare una cartella è semplicissimo:
|
1 2 |
New-Item -ItemType Directory -Path ".\Desktop" -name "Cartella" |
Anche la creazione di un File:
|
1 2 |
New-Item -ItemType "File" -Path ".\Desktop\Cartella\test1.txt" |
Possiamo anche creare più file in un solo passaggio:
|
1 2 |
New-Item -ItemType "File" -Path ".\Desktop\Cartella\test1.txt", ".\Desktop\Cartella\test2.txt" |
o creare un file con del contenuto:
|
1 2 |
New-Item -ItemType "File" -Path ".\Desktop\Cartella" -Name "File3.txt" -Value "contenuto." |

Figura 5: New-Item
Ovviamente possiamo concatenare I comandi:
|
1 2 |
New-Item -Path "$HOME\Desktop\contenuto_home.txt" -ItemType File -Value (Get-ChildItem $HOME | Out-String) |

Figura 6: concatenare cmdlet
Oppure in modo più leggibile ed elegante
|
1 2 3 4 5 |
$contenuto = Get-ChildItem -Path $HOME | Out-String New-Item -Path "$HOME\Desktop\contenuto_home.txt" -ItemType File -Force -Value $contenuto |
Leggere il Contenuto dei File: Get-Content
Il cmdlet Get-Content è il cmdlet di PowerShell che legge e restituisce il contenuto di un oggetto (file, Chiavi di registro)
Anche in questo caso abbiamo diverse possibilità:
|
1 2 3 4 5 6 7 8 |
Get-Content ".\Desktop\Cartella\test1.txt" o gc "path" cat ".\Desktop\Cartella\test1.txt" type ".\Desktop\Cartella\test1.txt" |
La sintassi minima è semplice:
|
1 2 |
Get-Content -Path "C:\percorso\file.txt" |
Però si possono usare numerosi parametri:
Get-Content [-Path] <String[]> [-ReadCount <Int64>] [-TotalCount <Int64>] [-Tail <Int32>] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Force] [-Credential <PSCredential>] [-Delimiter <String>] [-Wait] [-Raw] [-Encoding <Encoding>]
Parametri di Get-Content
| Parametro | Descrizione |
| -Path | Specifica il percorso del file da leggere. |
| -LiteralPath | Come -Path, ma tratta i caratteri speciali in modo letterale (es. [, ]). |
| -TotalCount | Legge solo le prime N righe del file. |
| -Tail | Legge solo le ultime N righe del file. |
| -ReadCount | Specifica quante righe inviare alla pipeline alla volta. |
| -Encoding | Specifica la codifica del file (es. UTF8, ASCII, Unicode). |
| -Raw | Restituisce l’intero contenuto come una singola stringa invece che riga per riga. |
| -Wait | Mantiene il file aperto e continua a leggere nuovi contenuti (simile a tail -f su Linux). |
| -Delimiter | Usa un delimitatore personalizzato al posto del fine riga. |
| -Force | Legge file nascosti o di sola lettura. |
| -Credential | Specifica le credenziali utente per accedere al file. |
Alcuni esempi:
Leggere solo le prime 5 righe
|
1 2 |
Get-Content -Path ".\Desktop\contenuto_home.txt"-TotalCount 10 |
Leggere solo le ultime 5 righe
|
1 2 |
Get-Content -Path ".\Desktop\contenuto_home.txt" -Tail 10 |
Leggere in tempo reale le ultime 5 righe
|
1 2 |
Get-Content -Path "C:\log\app.log" -Wait -Tail 5 |

Cercare del testo in un File: Select-String o sls
Il cmdlet Select-String consente di cercare testo (o pattern) anche utilizzando Regular Expression (regex) in stringhe o file
La sintassi è semplice:
Select-String -Pattern “testoDaCercare” -Path “C:\percorso\file.txt”
ma anche in questo caso le opzioni sono veramente numerose:
Select-String [-Pattern] <String[]> [-Path] <String[]> [-SimpleMatch] [-CaseSensitive] [-Quiet] [-List] [-NotMatch] [-AllMatches] [-Encoding <Encoding>] [-Context <Int32[]>] [-Culture <String>] [-NoEmphasis] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [<CommonParameters>]
Parametri di Select-String
| Parametro | Descrizione |
| -Pattern | Specifica il testo o l’espressione regolare da cercare. |
| -Path | Specifica il percorso del file o dei file in cui cercare. |
| -LiteralPath | Come -Path, ma tratta i caratteri speciali in modo letterale. |
| -InputObject | Accetta l’input direttamente dalla pipeline invece che da un file. |
| -CaseSensitive | Rende la ricerca sensibile alle maiuscole/minuscole. |
| -NotMatch | Restituisce le righe che non corrispondono al pattern. |
| -SimpleMatch | Tratta il pattern come testo semplice, disabilitando le espressioni regolari. |
| -AllMatches | Trova tutte le corrispondenze in ogni riga, non solo la prima. |
| -Quiet | Restituisce solo True o False invece delle righe corrispondenti. |
| -List | Restituisce solo il primo risultato per ogni file. |
| -Include | Filtra i file da includere nella ricerca (es. *.txt). |
| -Exclude | Filtra i file da escludere dalla ricerca. |
| -Encoding | Specifica la codifica del file da leggere (es. UTF8, ASCII). |
| -Context | Mostra N righe di contesto prima e dopo ogni corrispondenza. |
Esempi:
Cerca una parola in un file
|
1 2 |
Select-String -Path "CantoINF1.txt" -Pattern "Poeta" |
Verifica la presenza di una parola in un file
|
1 2 |
Select-String -Path "CantoINF1.txt" -Pattern "Poeta" -Quiet |
Cerca una parola in più file
|
1 2 |
Select-String -Pattern "Poeta" -Path "CantoINF*.txt" |
Cerca una parola in un file e fa vedere le N riighe prima, dopo della riga con la parola (utilissimo per sgrufolare noi log!)
|
1 2 |
Select-String -Pattern "Poeta" -Path "CantoINF2.txt" -Context 2, 2 |

Figura 7: Select-String
Cercare un eventID nel log di sistema
Ci si aspetterebbe
|
1 2 |
Get-WinEvent -LogName System | Select-String -Pattern "7023" |
Invece bisogna usare
|
1 2 |
Get-WinEvent -LogName System | Out-String -Stream | Select-String "7023" |
Anche se questa sintassi è deprecata. Per confondere i russi bisogna usare
|
1 2 |
Get-WinEvent -LogName System | Where-Object {$_.Id -eq "7023"} |
Che però ha un senso lavorando ad oggetti: il che significa che se volessimo cercare ad esempio tutti gli errori ci basta sostituire $_.Id -eq “7023” con $_.LevelDisplayName -eq “Error” o con $_.Message se volessimo cercare un messaggio in particolare

Sovrascrivere il contenuto di un file: Set-Content
Il cmdlet Set-Content che sostituisce il contenuto di un file con un nuovo testo. se il file è vuoto lo crea e lo popola
È il complemento di Get-Content: mentre quest’ultimo legge, Set-Content scrive.
Fa coppia con di Add-Content, che invece di sovrascrive completamente il contenuto esistente, aggiune al fondo il testo Set-Content -Path “documento.txt” -Value “Nuovo contenuto”
Attenzione: Set-Content sovrascrive il contenuto precedente!
Sovrascrivere il contenuto di un file
|
1 2 |
Set-Content ".\Desktop\contenuto_home.txt" "tizio, Caio e Sempronio" |

Figura 8: Set-Content (SOVRASCRIVE)
Sovrascrivere il contenuto di un file con più righe
|
1 2 3 4 5 6 |
Set-Content ".\Desktop\contenuto_home.txt" @( "Qui" "Quo" "Qua" ) |
Oppure
|
1 2 |
Set-Content ".\Desktop\contenuto_home.txt" -Value "Qui","Quo","Qua" |
Set-Content e variabili
|
1 2 3 4 5 |
$DoveSono=Get-Location Set-Content -Path ".\contenuto_home.txt" -Value $DoveSono |

Figura 9: Set-Content multilinea e variabili
Aggiungere contenuto ad un file: Add-Content
il cmdlet Add-Content aggiunge contenuto in coda a un file esistente, senza sovrascriverlo.
Se il file non esite lo crea automaticamente. Quindi per sicurezza conviene spesso usare Add -Content invece di Set-Content. Al massimo ci troviamo più linee 😉
Aggiungo una riga al fondo del file
|
1 2 |
Add-Content -Path ".\contenuto_home.txt" -Value "Paperino" |
Aggiungo una variabile
|
1 2 |
Add-Content -Path ".\contenuto_home.txt" "$(Get-Date) - CreazioneDeposito" |
Aggiungo più linee
|
1 2 |
Add-Content -Path ".\contenuto_home.txt" -Value "di","Zio","Paperone" |

Figura 10: Add-Content
Fare ordine nel File System
Qui PowerShell cala il poker: Copy-Item, Move-Item, Rename-Item e Remove-Item.
Copiare file: Copy-Item (alias: cp)
Il cmdlet Copy-Item copia file e cartelle da un percorso a un altro. Non elimina gli elementi sorgente ma se esiste già la destinazione sovrascrive il contenuto
Sintassi:
Copy-Item [-Path] <string[]> [[-Destination] <string>] [-Recurse] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-PassThru] [-WhatIf] [-Confirm]
Parametri di Copy-Item
| Parametro | Descrizione |
| -Path | File o cartella sorgente da copiare |
| -Destination | Cartella o file di destinazione |
| -Recurse | Include tutte le sottocartelle nella copia |
| -Force | Sovrascrive i file esistenti senza chiedere conferma |
| -Filter | Filtra i file per pattern (es. *.txt) |
| -Include | Include solo i file che corrispondono al pattern specificato |
| -Exclude | Esclude i file che corrispondono al pattern specificato |
| -WhatIf | Simula l’operazione senza eseguirla realmente |
| -PassThru | Restituisce l’oggetto copiato come output |
| -Confirm | Chiede conferma prima di eseguire ogni copia |

Copio un file con un nome nuovo
|
1 2 |
Copy-Item ".\contenuto_home.txt" -Destination "FileNuovo.txt" |
Copio tutto il contento di una cartella in una cartella nuova
|
1 2 |
Copy-Item -Recurse "".\Cartella\" ".\Cartella2\" |

Copio solo i file di un certo tipo
|
1 2 |
Copy-Item ".\Cartella3\*.txt" ".\Cartella4\" -Recurse |
NOTA: visto che la cartella progetto non contiene file .txt il comando non ha creato la sottocartella progetto

Spostare file: Move-Item (alias: mv o move)
Il cmdlet Move-Item sposta file e cartelle da un percorso a un altro. Attenzione se esiste già l’oggetto di destinazione Fallisce. Se si sposta un file nello stesso percorso è come se lo rinominassi.
Sintassi:
Move-Item [-Path] <string[]> [[-Destination] <string>] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-PassThru] [-WhatIf] [-Confirm]
Parametri di Move-Item
| Parametro | Descrizione |
| -Path | File o cartella da eliminare |
| -Recurse | Elimina anche tutto il contenuto della cartella |
| -Force | Elimina anche file nascosti o di sola lettura |
| -Filter | Filtra per pattern (es. *.txt) |
| -Include | Include solo certi file |
| -Exclude | Esclude certi file |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eliminare |
Esempi:
Spostare un file:
|
1 2 |
Move-Item ".\FileNuovo.txt" -Destination ".\Cartella" |
Spostare tutti i file .txt
|
1 2 |
Move-Item ".\*.txt" ".\Cartella\" |
Spostare una cartella intera
|
1 2 |
Move-Item ".\Cartella\" ".\Destinazione\" |
spostare un file nello stesso percorso (è lo stesso che rinominarlo)
|
1 2 |
Move-Item ".\vecchionome.txt" ".\nuovonome.txt" |
Spostare e rinominare un file in un solo passaggio:
|
1 2 |
move-Item ".\File1.txt" -Destination ".\Cartella\File2.txt" |
Si può anche dare la Move-Item di folder. In questo caso è come se si facesse un rename della cartella
|
1 2 |
Move-Item ".\Cartella\" -Destination ".\Cartella2\" |
NOTA: la keyword -Destination si può omettere
Rinominare file: Rename-Item (alias: ren)
Il cmdlet Rename-Item rinomina file e cartelle nello stesso percorso.
Sitassi:
Rename-Item [-Path] <string> [-NewName] <string> [-Force] [-PassThru] [-WhatIf] [-Confirm]
Parametri di Rename-Item
| Parametro | Descrizione |
| -Path | File o cartella da rinominare |
| -NewName | Nuovo nome (solo nome, senza percorso) |
| -Force | Sovrascrive senza conferma |
| -PassThru | Restituisce l’oggetto rinominato |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eseguire |
Esempi:
Rinominare un file
|
1 2 |
Rename-Item -Path ".\File1.txt" -NewName "File2.txt" |
Rinominare una cartella
|
1 2 |
Rename-Item -Path ".\Cartella" -NewName "CartellaNew" |
Alcuni giochi più simpatici
Rinominare aggiungendo la data al nome del file
|
1 2 |
Rename-Item -Path "\FileNuovo.txt" -NewName "File1_$(Get-Date -Format 'yyyyMMdd').txt |
Cambiare estensione da .txt a .log
|
1 2 |
Rename-Item -Path ".\File1.txt" -NewName "File1.log" |
Rinominare tutti i .txt dentro una cartella aggiungendo il prefisso “OLD_”
|
1 2 |
Get-ChildItem ".\Cartella\*.txt" | Rename-Item -NewName {"OLD_" + $_.Name } |
Rinominare tutti i file di una Cartella sostituendo gli spazi con underscore
|
1 2 |
Get-ChildItem ".\Cartella" | Rename-Item -NewName {$_.Name -replace " ", "_"} |
rinominare in sequenza (File_001.txt, File_002.txt, File_003.txt), tutti i file .*txt dentro una cartella
|
1 2 3 4 5 |
$i = 1 Get-ChildItem ".\Cartella\*.txt" | Rename-Item -NewName { "File_{0:D3}.txt" -f $script:i++ } |
Eliminare file e cartelle: Remove-Item (alias: rm)
Il cmdlet Remove-Item elimina file e cartelle.
ATTENZIONE: non usa il cestino. La cancellazione è definitiva
Remove-Item [-Path] <string[]> [-Recurse] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-WhatIf] [-Confirm]
Parametri di Remove-Item
| Parametro | Descrizione |
| -Path | File o cartella da eliminare |
| -Recurse | Elimina anche tutto il contenuto della cartella |
| -Force | Elimina anche file nascosti o di sola lettura |
| -Filter | Filtra per pattern (es. *.txt) |
| -Include | Include solo certi file |
| -Exclude | Esclude certi file |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eliminare |
Eliminare un file
|
1 2 |
Remove-Item ".\File1.txt" |
Eliminare tutti i file .txt nella cartella corrente
|
1 2 |
Remove-Item ".\*.txt" |
Eliminare una cartella con tutto il contenuto
|
1 2 |
Remove-Item ".\Cartella" -Recurse |
Forzare l’eliminazione di un file di sola lettura o nascosto
|
1 2 |
Remove-Item ".\File1.txt" -Force |
Eliminare con richiesta di conferma
|
1 2 |
Remove-Item ".\File1.txt" -Confirm |
Eliminare solo i file più vecchi di 30 giorni
|
1 2 |
Get-ChildItem ".\Cartella" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item |
Attenzione: L’eliminazione è permanente! Non c’è un cestino in PowerShell.
Informazioni su File e Cartelle
Ottenere informazioni dettagliate: Get-Item
Il cmdlet Get-Item restituisce l’oggetto (file o cartella) indicato, con le sue proprietà principali.
|
1 2 |
Get-Item "documento.txt" |
Output:
|
1 2 3 4 5 6 |
Directory: C:\Users\TuoNome\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 15/03/2024 14:30:00 1024 documento.txt |
Visualizzare proprietà specifiche: Get-ItemProperty
|
1 2 |
Get-ItemProperty "documento.txt" |
Esempi utili:
Ottenere solo la data di modifica
|
1 2 |
(Get-Item "documento.txt").LastWriteTime |
Ottenere solo la dimensione in byte
|
1 2 |
(Get-Item "documento.txt").Length |
Ottenere la dimensione in KB
|
1 2 |
(Get-Item "documento.txt").Length / 1KB |
Ottenere tutte le proprietà di un file
|
1 2 |
Get-Item "documento.txt" | Get-Member |
Calcolare la dimensione di una cartella
Questo comando mostra la dimensione totale di una cartella in megabyte.
|
1 2 3 |
(Get-ChildItem -Path "C:\Users\TuoNome\Desktop" -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB |
Esempi:
Dimensione della cartella corrente
|
1 2 |
(Get-ChildItem -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB |
Dimensione di una cartella specifica in GB
|
1 2 3 |
(Get-ChildItem -Path "C:\Progetti" -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB |
Operazioni Avanzate e Utili
Trovare file per nome: Where-Object
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Name -like "*.txt"} |
Esempi:
Trovare tutti i file .pdf nella cartella
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Name -like "*.pdf"} |
Trovare file modificati negli ultimi 7 giorni
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)} |
Trovare file vuoti
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Length -eq 0} |
Ordinare file per data: Sort-Object
|
1 2 |
Get-ChildItem | Sort-Object -Property LastWriteTime -Descending |
Esempi:
Mostrare i file più recenti per primi
|
1 2 |
Get-ChildItem | Sort-Object LastWriteTime -Descending |
Ordinare per dimensione (dal più grande)
|
1 2 |
Get-ChildItem | Sort-Object Length -Descending |
Ordinare per nome alfabetico
|
1 2 |
Get-ChildItem | Sort-Object Name |
Creare cartelle e file in batch
Creare una struttura di cartelle e di file di configurazione per un nuovo progetto:
Creare una struttura di cartelle
|
1 2 3 4 |
mkdir "C:\Progetti\MioApp\src" mkdir "C:\Progetti\MioApp\bin" mkdir "C:\Progetti\MioApp\docs" |
Creare file di configurazione
|
1 2 3 |
New-Item -ItemType File -Path "C:\Progetti\MioApp\README.md" New-Item -ItemType File -Path "C:\Progetti\MioApp\config.ini" |
Verificare se un file o cartella esiste: Test-Path
Se il file esiste Test-Path restituisce True, altrimenti False.
|
1 2 |
Test-Path -Path "C:\Users\TuoNome\Desktop\documento.txt" |
Esempi:
Verificare se un file esiste
|
1 2 3 4 5 6 |
if (Test-Path "documento.txt") { Write-Host "Il file esiste" } else { Write-Host "Il file non esiste" } |
Verificare se una cartella esiste
|
1 2 3 4 |
if (Test-Path -PathType Container "MiaCartella") { Write-Host "La cartella esiste" } |
Esempi Pratici Completi
Esempio 1: Fare un backup di una cartella
|
1 2 3 4 5 6 7 8 9 10 11 |
# Definire le cartelle $sorgente = "C:\Users\TuoNome\Documenti\Progetti" $destinazione = "C:\Backup\Progetti_$(Get-Date -Format 'yyyy-MM-dd')" # Creare la cartella di backup con data mkdir $destinazione # Copiare tutto il contenuto Copy-Item -Path $sorgente -Destination $destinazione -Recurse Write-Host "Backup completato: $destinazione" |
Esempio 2: Pulire i file vecchi
|
1 2 3 4 5 6 7 8 9 10 11 |
# Eliminare file non modificati negli ultimi 30 giorni $giorni = 30 $data_limite = (Get-Date).AddDays(-$giorni) $cartella = "C:\Users\TuoNome\Documenti\Vecchi" Get-ChildItem -Path $cartella -Recurse | Where-Object {$_.LastWriteTime -lt $data_limite} | Remove-Item -Confirm Write-Host "Operazione completata" |
Esempio 3: Rinominare batch di file
|
1 2 3 4 5 6 7 8 9 10 11 |
# Rinominare tutti i file .txt aggiungendo la data $data = Get-Date -Format "yyyy-MM-dd" Get-ChildItem -Filter "*.txt" | ForEach-Object { $nuovo_nome = "$($_.BaseName)_$data.txt" Rename-Item -Path $_.FullName -NewName $nuovo_nome } Write-Host "Rinomina completata" |
Esempio 4: Generare un rapporto delle dimensioni
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Mostrare la dimensione di ogni cartella Get-ChildItem -Directory | ForEach-Object { $dimensione = (Get-ChildItem -Path $_.FullName -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB [PSCustomObject]@{ Cartella = $_.Name "Dimensione (MB)" = [math]::Round($dimensione, 2) } } | Sort-Object "Dimensione (MB)" -Descending | Format-Table -AutoSize |
Consigli Utili per Principianti
- Usa i tab per completare i percorsi: Scrivi parte di un percorso e premi TAB per far completare a PowerShell.
- Leggi gli errori con attenzione: PowerShell di solito dà messaggi di errore chiari e utili.
- Usa -Confirm prima di operazioni pericolose: Questo chiederà una conferma prima di eliminare o sovrascrivere file.
- Copia i comandi complessi in un blocco note prima: Facilita la correzione di errori di sintassi.
- Usa Get-Help: Per sapere come usare un comando, digita Get-Help Get-ChildItem per vedere i dettagli.
- Lavora sempre in cartelle di test all’inizio: Prima di fare operazioni importanti, prova su file di test.
Riepilogo dei Comandi Essenziali
| Operazione | Comando | Alias |
| Cartella corrente | Get-Location | pwd |
| Cambiare cartella | Set-Location | cd |
| Elencare file | Get-ChildItem | ls, dir |
| Creare cartella | New-Item -ItemType Directory | mkdir |
| Creare file | New-Item -ItemType File | |
| Leggere file | Get-Content | cat, type |
| Cercare testo | Select-String | sls |
| Sovrascrivere contenuto | Set-Content | |
| Aggiungere contenuto | Add-Content | >> |
| Copiare | Copy-Item | cp |
| Spostare | Move-Item | mv, move |
| Rinominare | Rename-Item | ren |
| Eliminare | Remove-Item | rm, del |
| Informazioni file | Get-Item | |
| Esiste? | Test-Path |
Conclusione
PowerShell è uno strumento incredibilmente potente per gestire file e cartelle. Anche se all’inizio potrebbe sembrare complesso, con la pratica diventerà naturale. Inizia con i comandi semplici, poi passa gradualmente a quelli più avanzati.
Ricorda: il modo migliore per imparare è fare pratica! Apri PowerShell e inizia a sperimentare con questi comandi su file rigorosamente di test.
Alcune note su quello che ho fatto o notato:
Output di Get-Item: l’ho messo in un
|
1 2 3 4 5 6 7 |
semplice, senza lang:ps, perché è un risultato e non un comando. Tabelle: i nomi di cmdlet e parametri dentro le tabelle li ho lasciati com’erano, perché sono riferimenti inline e non comandi da eseguire. Errore corretto: nell’esempio “aggiungendo la data al nome del file” mancava la virgoletta di chiusura dopo .txt. Ho aggiunto anche il . davanti al percorso (".\FileNuovo.txt"), che nell’originale era "\FileNuovo.txt". Refusi non modificati: ho lasciato invariati “Sitassi” (dovrebbe essere “Sintassi”) e la descrizione di -Path nella tabella di Move-Item (“File o cartella da eliminare”, copiata da Remove-Item). Se vuoi li correggo. Quando vedi Quel tag deve essere sosituito con |
|
1 2 |
e |
Ecco l’articolo aggiornato. Ora ogni … esatto è diventato
|
1 2 |
… |
, comprese le occorrenze inline (-Destination, Get-Item, Test-Path, True, False) e l’output di Get-Item.
html
Copio solo i file di un certo tipo
|
1 2 |
Copy-Item ".\Cartella3\*.txt" ".\Cartella4\" -Recurse |
NOTA: visto che la cartella progetto non contiene file .txt il comando non ha creato la sottocartella progetto

Spostare file: Move-Item (alias: mv o move)
Il cmdlet Move-Item sposta file e cartelle da un percorso a un altro. Attenzione se esiste già l’oggetto di destinazione Fallisce. Se si sposta un file nello stesso percorso è come se lo rinominassi.
Sintassi:
|
1 2 |
Move-Item [-Path] <string[]> [[-Destination] <string>] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-PassThru] [-WhatIf] [-Confirm] |
Parametri di Move-Item
| Parametro | Descrizione |
| -Path | File o cartella da eliminare |
| -Recurse | Elimina anche tutto il contenuto della cartella |
| -Force | Elimina anche file nascosti o di sola lettura |
| -Filter | Filtra per pattern (es. *.txt) |
| -Include | Include solo certi file |
| -Exclude | Esclude certi file |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eliminare |
Esempi:
Spostare un file:
|
1 2 |
Move-Item ".\FileNuovo.txt" -Destination ".\Cartella" |
Spostare tutti i file .txt
|
1 2 |
Move-Item ".\*.txt" ".\Cartella\" |
Spostare una cartella intera
|
1 2 |
Move-Item ".\Cartella\" ".\Destinazione\" |
spostare un file nello stesso percorso (è lo stesso che rinominarlo)
|
1 2 |
Move-Item ".\vecchionome.txt" ".\nuovonome.txt" |
Spostare e rinominare un file in un solo passaggio:
|
1 2 |
Move-Item ".\File1.txt" -Destination ".\Cartella\File2.txt" |
Si può anche dare la Move-Item di folder. In questo caso è come se si facesse un rename della cartella
|
1 2 |
Move-Item ".\Cartella\" -Destination ".\Cartella2\" |
NOTA: la keyword
|
1 2 |
-Destination si può omettere |
Rinominare file: Rename-Item (alias: ren)
Il cmdlet Rename-Item rinomina file e cartelle nello stesso percorso.
Sitassi:
|
1 2 |
Rename-Item [-Path] <string> [-NewName] <string> [-Force] [-PassThru] [-WhatIf] [-Confirm] |
Parametri di Rename-Item
| Parametro | Descrizione |
| -Path | File o cartella da rinominare |
| -NewName | Nuovo nome (solo nome, senza percorso) |
| -Force | Sovrascrive senza conferma |
| -PassThru | Restituisce l’oggetto rinominato |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eseguire |
Esempi:
Rinominare un file
|
1 2 |
Rename-Item -Path ".\File1.txt" -NewName "File2.txt" |
Rinominare una cartella
|
1 2 |
Rename-Item -Path ".\Cartella" -NewName "CartellaNew" |
Alcuni giochi più simpatici
Rinominare aggiungendo la data al nome del file
|
1 2 |
Rename-Item -Path ".\FileNuovo.txt" -NewName "File1_$(Get-Date -Format 'yyyyMMdd').txt" |
Cambiare estensione da .txt a .log
|
1 2 |
Rename-Item -Path ".\File1.txt" -NewName "File1.log" |
Rinominare tutti i .txt dentro una cartella aggiungendo il prefisso “OLD_”
|
1 2 |
Get-ChildItem ".\Cartella\*.txt" | Rename-Item -NewName {"OLD_" + $_.Name } |
Rinominare tutti i file di una Cartella sostituendo gli spazi con underscore
|
1 2 |
Get-ChildItem ".\Cartella" | Rename-Item -NewName {$_.Name -replace " ", "_"} |
rinominare in sequenza (File_001.txt, File_002.txt, File_003.txt), tutti i file .*txt dentro una cartella
|
1 2 3 |
$i = 1 Get-ChildItem ".\Cartella\*.txt" | Rename-Item -NewName { "File_{0:D3}.txt" -f $script:i++ } |
Eliminare file e cartelle: Remove-Item (alias: rm)
Il cmdlet Remove-Item elimina file e cartelle.
ATTENZIONE: non usa il cestino. La cancellazione è definitiva
|
1 2 |
Remove-Item [-Path] <string[]> [-Recurse] [-Force] [-Filter <string>] [-Include <string[]>] [-Exclude <string[]>] [-WhatIf] [-Confirm] |
Parametri di Remove-Item
| Parametro | Descrizione |
| -Path | File o cartella da eliminare |
| -Recurse | Elimina anche tutto il contenuto della cartella |
| -Force | Elimina anche file nascosti o di sola lettura |
| -Filter | Filtra per pattern (es. *.txt) |
| -Include | Include solo certi file |
| -Exclude | Esclude certi file |
| -WhatIf | Simula senza eseguire |
| -Confirm | Chiede conferma prima di eliminare |
Eliminare un file
|
1 2 |
Remove-Item ".\File1.txt" |
Eliminare tutti i file .txt nella cartella corrente
|
1 2 |
Remove-Item ".\*.txt" |
Eliminare una cartella con tutto il contenuto
|
1 2 |
Remove-Item ".\Cartella" -Recurse |
Forzare l’eliminazione di un file di sola lettura o nascosto
|
1 2 |
Remove-Item ".\File1.txt" -Force |
Eliminare con richiesta di conferma
|
1 2 |
Remove-Item ".\File1.txt" -Confirm |
Eliminare solo i file più vecchi di 30 giorni
|
1 2 |
Get-ChildItem ".\Cartella" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item |
Attenzione: L’eliminazione è permanente! Non c’è un cestino in PowerShell.
Informazioni su File e Cartelle
Ottenere informazioni dettagliate: Get-Item
Il cmdlet
|
1 2 |
Get-Item |
restituisce l’oggetto (file o cartella) indicato, con le sue proprietà principali.
|
1 2 |
Get-Item "documento.txt" |
Output:
|
1 2 3 4 5 6 |
Directory: C:\Users\TuoNome\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 15/03/2024 14:30:00 1024 documento.txt |
Visualizzare proprietà specifiche: Get-ItemProperty
|
1 2 |
Get-ItemProperty "documento.txt" |
Esempi utili:
Ottenere solo la data di modifica
|
1 2 |
(Get-Item "documento.txt").LastWriteTime |
Ottenere solo la dimensione in byte
|
1 2 |
(Get-Item "documento.txt").Length |
Ottenere la dimensione in KB
|
1 2 |
(Get-Item "documento.txt").Length / 1KB |
Ottenere tutte le proprietà di un file
|
1 2 |
Get-Item "documento.txt" | Get-Member |
Calcolare la dimensione di una cartella
Questo comando mostra la dimensione totale di una cartella in megabyte.
|
1 2 3 |
(Get-ChildItem -Path "C:\Users\TuoNome\Desktop" -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB |
Esempi:
Dimensione della cartella corrente
|
1 2 |
(Get-ChildItem -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB |
Dimensione di una cartella specifica in GB
|
1 2 3 |
(Get-ChildItem -Path "C:\Progetti" -Recurse | Measure-Object -Property Length -Sum).Sum / 1GB |
Operazioni Avanzate e Utili
Trovare file per nome: Where-Object
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Name -like "*.txt"} |
Esempi:
Trovare tutti i file .pdf nella cartella
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Name -like "*.pdf"} |
Trovare file modificati negli ultimi 7 giorni
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)} |
Trovare file vuoti
|
1 2 |
Get-ChildItem -Recurse | Where-Object {$_.Length -eq 0} |
Ordinare file per data: Sort-Object
|
1 2 |
Get-ChildItem | Sort-Object -Property LastWriteTime -Descending |
Esempi:
Mostrare i file più recenti per primi
|
1 2 |
Get-ChildItem | Sort-Object LastWriteTime -Descending |
Ordinare per dimensione (dal più grande)
|
1 2 |
Get-ChildItem | Sort-Object Length -Descending |
Ordinare per nome alfabetico
|
1 2 |
Get-ChildItem | Sort-Object Name |
Creare cartelle e file in batch
Creare una struttura di cartelle e di file di configurazione per un nuovo progetto:
Creare una struttura di cartelle
|
1 2 3 4 |
mkdir "C:\Progetti\MioApp\src" mkdir "C:\Progetti\MioApp\bin" mkdir "C:\Progetti\MioApp\docs" |
Creare file di configurazione
|
1 2 3 |
New-Item -ItemType File -Path "C:\Progetti\MioApp\README.md" New-Item -ItemType File -Path "C:\Progetti\MioApp\config.ini" |
Verificare se un file o cartella esiste: Test-Path
Se il file esiste
|
1 2 |
Test-Path |
restituisce
|
1 2 |
True |
, altrimenti
|
1 2 |
False |
.
|
1 2 |
Test-Path -Path "C:\Users\TuoNome\Desktop\documento.txt" |
Esempi:
Verificare se un file esiste
|
1 2 3 4 5 6 |
if (Test-Path "documento.txt") { Write-Host "Il file esiste" } else { Write-Host "Il file non esiste" } |
Verificare se una cartella esiste
|
1 2 3 4 |
if (Test-Path -PathType Container "MiaCartella") { Write-Host "La cartella esiste" } |
Esempi Pratici Completi
Esempio 1: Fare un backup di una cartella
|
1 2 3 4 5 6 7 8 9 10 11 |
# Definire le cartelle $sorgente = "C:\Users\TuoNome\Documenti\Progetti" $destinazione = "C:\Backup\Progetti_$(Get-Date -Format 'yyyy-MM-dd')" # Creare la cartella di backup con data mkdir $destinazione # Copiare tutto il contenuto Copy-Item -Path $sorgente -Destination $destinazione -Recurse Write-Host "Backup completato: $destinazione" |
Esempio 2: Pulire i file vecchi
|
1 2 3 4 5 6 7 8 9 10 11 |
# Eliminare file non modificati negli ultimi 30 giorni $giorni = 30 $data_limite = (Get-Date).AddDays(-$giorni) $cartella = "C:\Users\TuoNome\Documenti\Vecchi" Get-ChildItem -Path $cartella -Recurse | Where-Object {$_.LastWriteTime -lt $data_limite} | Remove-Item -Confirm Write-Host "Operazione completata" |
Esempio 3: Rinominare batch di file
|
1 2 3 4 5 6 7 8 9 10 11 |
# Rinominare tutti i file .txt aggiungendo la data $data = Get-Date -Format "yyyy-MM-dd" Get-ChildItem -Filter "*.txt" | ForEach-Object { $nuovo_nome = "$($_.BaseName)_$data.txt" Rename-Item -Path $_.FullName -NewName $nuovo_nome } Write-Host "Rinomina completata" |
Esempio 4: Generare un rapporto delle dimensioni
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Mostrare la dimensione di ogni cartella Get-ChildItem -Directory | ForEach-Object { $dimensione = (Get-ChildItem -Path $_.FullName -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB [PSCustomObject]@{ Cartella = $_.Name "Dimensione (MB)" = [math]::Round($dimensione, 2) } } | Sort-Object "Dimensione (MB)" -Descending | Format-Table -AutoSize |
Consigli Utili per Principianti
- Usa i tab per completare i percorsi: Scrivi parte di un percorso e premi TAB per far completare a PowerShell.
- Leggi gli errori con attenzione: PowerShell di solito dà messaggi di errore chiari e utili.
- Usa -Confirm prima di operazioni pericolose: Questo chiederà una conferma prima di eliminare o sovrascrivere file.
- Copia i comandi complessi in un blocco note prima: Facilita la correzione di errori di sintassi.
- Usa Get-Help: Per sapere come usare un comando, digita Get-Help Get-ChildItem per vedere i dettagli.
- Lavora sempre in cartelle di test all’inizio: Prima di fare operazioni importanti, prova su file di test.
Riepilogo dei Comandi Essenziali
| Operazione | Comando | Alias |
| Cartella corrente | Get-Location | pwd |
| Cambiare cartella | Set-Location | cd |
| Elencare file | Get-ChildItem | ls, dir |
| Creare cartella | New-Item -ItemType Directory | mkdir |
| Creare file | New-Item -ItemType File | |
| Leggere file | Get-Content | cat, type |
| Cercare testo | Select-String | sls |
| Sovrascrivere contenuto | Set-Content | |
| Aggiungere contenuto | Add-Content | >> |
| Copiare | Copy-Item | cp |
| Spostare | Move-Item | mv, move |
| Rinominare | Rename-Item | ren |
| Eliminare | Remove-Item | rm, del |
| Informazioni file | Get-Item | |
| Esiste? | Test-Path |
Conclusione
PowerShell è uno strumento incredibilmente potente per gestire file e cartelle. Anche se all’inizio potrebbe sembrare complesso, con la pratica diventerà naturale. Inizia con i comandi semplici, poi passa gradualmente a quelli più avanzati.
Ricorda: il modo migliore per imparare è fare pratica! Apri PowerShell e ini