Utilizzo del Cmdlet Copy-Item di PowerShell per copiare i file
Sep 16, 2024
Cos'è il Cmdlet Copy-Item di PowerShell?
Il cmdlet Copy-Item in Powershell è utilizzato principalmente per copiare file dalla sorgente alla destinazione. In termini di numero di file, possono essere singoli o multipli insieme al loro contenuto. Può anche funzionare su diversi sistemi di file come locali, condivisioni di rete ecc.
Sintassi di base e parametri
La sintassi di base per il cmdlet PowerShell Copy-Item è la seguente:
Copy-Item -Path <source> -Destination <destination> [<parameters>]
Se digiti solo il cmdlet, PowerShell ti chiederà la Source, come mostrato di seguito:
Il primo parametro obbligatorio è il percorso di origine. Questo parametro del percorso dell'elemento specifica il percorso dell'elemento o degli elementi da copiare. La fonte può essere un percorso di file o cartella. È possibile specificare più percorsi utilizzando un elenco separato da virgole, e il percorso può contenere caratteri jolly. Una buona prassi sarebbe fornire una stringa di percorso di destinazione per specificare il percorso in cui gli elementi dovrebbero essere copiati. Se si copia un singolo elemento, il percorso può includere un nuovo nome per l'elemento copiato, se desiderato.
Di seguito è riportato un elenco di altri parametri per il cmdlet PowerShell Copy-Item:
- -Recurse: Copia le sottodirectory e il loro contenuto in modo ricorsivo, il che significa che il cmdlet Copy-Item viene applicato alla cartella di primo livello e a tutti i livelli di sottocartelle sottostanti.
- -Force parametro: Sovrascrive i file esistenti di sola lettura e crea le directory di destinazione se non esistono.
- -Container: Preserva gli oggetti contenitore durante le operazioni di copia, il che è utile quando si copiano strutture di directory.
- -Filter: Specifica una stringa di filtro per qualificare il parametro del percorso, come ad esempio specificare un'estensione di file particolare
- -Include: Specifica gli elementi da copiare e supporta i caratteri jolly. Vengono copiati solo gli elementi che corrispondono sia ai parametri Path che Include
- -Exclude: Specifica gli elementi da omettere durante la copia, supporta i caratteri jolly
- -Credential: Specifica le credenziali dell'account utente da utilizzare per l'operazione
- -WhatIf: Mostra cosa accadrebbe se il comando venisse eseguito senza eseguirlo realmente
- -Conferma: Richiede conferma prima di eseguire il comando
- -FromSession: Specifica l'oggetto PSSession dal quale ottenere un file remoto.
- -ToSession: Specifica l'oggetto PSSession al quale inviare un file remoto
Contenuti correlati selezionati:
Casi d'uso comuni
Per la maggior parte degli esempi, copieremo file in più posizioni sul computer locale. Esistono tuttavia una varietà di casi d'uso comuni per il cmdlet Copy-Item, tra cui:
- Creazione di backup di file e cartelle importanti
- Distribuzione di file o applicazioni semplici su più macchine
- Migrazione di grandi quantità di file tra server o posizioni di archiviazione
- Gli sviluppatori possono creare snapshot delle cartelle di progetto in diverse fasi dello sviluppo.
- Distribuisci file di configurazione su più server
Ora confrontiamo il cmdlet Copy-Item con altri cmdlet per la gestione dei file:
Copy-Item vs. Move-Item:
- Copy-Item crea un duplicato, lasciando l'originale intatto
- Move-Item sposta il file/la cartella, rimuovendolo dalla posizione originale
Copy-Item vs. Get-ChildItem
- Copy-Item esegue l'azione di copia
- Get-ChildItem elenca file e cartelle ed è spesso utilizzato in combinazione con Copy-Item
Si noti che il cmdlet Copy-Item è consigliato per la copia di base dei file. Coloro che cercano funzionalità più avanzate per il trasferimento di file di grandi dimensioni o per il mirroring possono prendere in considerazione Microsoft Robocopy.
Copiare file con il cmdlet PowerShell Copy-Item
Esempio di copia file di base
In questo esempio, vogliamo copiare un foglio di calcolo da una cartella all'altra utilizzando il comando PowerShell copy item.
Copy-Item -Path "C:\Destination One\SpreadsheetOne.xlsx" -Destination "c:\Destination Two"
Ecco come appare in PowerShell:
Copiare più file
Ora, copiamo più di un file alla volta. Nota che i percorsi dei file utilizzano unità diverse. Ricorda che se la directory di destinazione non esiste, PowerShell la creerà.
Copy-Item -Path "C:\source\file1.txt","C:\Source\file2.txt" -Destination "D:\Destination Two"
Copia dei file con rinominazione
Puoi copiare un file in una nuova cartella e rinominarlo nel processo utilizzando il comando sottostante:
Copy-Item -Path "C:\Source\file1.txt" -Destination "C:\Destination Two\NewName1.txt"
Ecco come appare in PowerShell:
Copiare cartelle con PowerShell
La capacità di copia di PowerShell non è limitata solo ai file – è possibile anche copiare una cartella utilizzando il cmdlet Copy-Item in nuove posizioni. Di seguito, vi mostriamo come utilizzare il comando di PowerShell per copiare cartelle e contenuti.
Esempio di copia di una cartella base
Utilizza il comando di PowerShell copia cartella di seguito per copiare una cartella in una diversa posizione. Questo comando di copia di PowerShell copierà tutti i file nella cartella “source” e li posizionerà nella cartella di destinazione.
Copy-Item -Path "C:\source\folder" -Destination "D:\destination"
Copiare cartelle con sottocartelle
Cosa succederebbe se la cartella di origine avesse molteplici sottocartelle al suo interno? Utilizzando il comando base sopra, qualsiasi cosa all'interno delle sottocartelle sarebbe stata ignorata. Se vuoi copiare tutto nella cartella di origine, inclusi i contenuti delle sottocartelle, devi eseguire un comando di copia cartella e sottocartelle di PowerShell utilizzando il parametro Recurse.
Copy-Item -Path "C:\source\folder" -Destination "D:\destination" -Recurse
Contenuti correlati selezionati:
Copiare e unire più cartelle
Supponiamo che tu voglia copiare i file di due cartelle sorgente e unirli in una singola cartella di destinazione. Questo è facilmente realizzabile utilizzando il comando di PowerShell per copiare il contenuto di una cartella in un'altra. Qui, due percorsi sorgente sono separati da una virgola. Vengono copiati e poi uniti nella cartella di destinazione.
Copy-Item -Path "C:\source1\*","C:\source2\*" -Destination "D:\destination"
Tecniche avanzate di copia di file e cartelle
Utilizzo di caratteri jolly nei percorsi dei file
I caratteri jolly consentono di copiare più file o cartelle che corrispondono a uno schema specifico senza elencare ogni elemento singolarmente. Sono ideali per gestire un gran numero di file o cartelle, poiché l'uso dei caratteri jolly può ridurre notevolmente la quantità di codice necessaria. Nell'esempio sottostante, il carattere jolly viene utilizzato per qualsiasi file .txt:
Copy-Item -Path "C:\source\*.txt" -Destination "C:\Destination Two"
Ecco come appare in PowerShell:
Filtraggio dei file con parametri Include ed Exclude
Ci saranno momenti in cui vorrai escludere specifici file all'interno di una cartella dalla copia. Potresti voler escludere o includere solo certi tipi di file o versioni di file, o non includere file specifici che contengono informazioni sensibili. Di conseguenza, probabilmente vorrai escludere file temporanei o non necessari durante un processo di backup o migrazione.
Nell'esempio sottostante, stiamo copiando e specificando che tutti i file di log devono essere considerati per la copia; tuttavia, verrà escluso qualsiasi file di log che abbia anche un'estensione .tmp.
Copy-Item -Path "C:\source\*" -Destination "D:\destination" -Include "*.log" -Exclude "*.tmp"
Utilizzando il parametro Force per sovrascrivere i file
Di default, Copy-Item sovrascriverà i file esistenti nella destinazione senza chiedere conferma. A volte, potresti incontrare una situazione in cui la cartella di destinazione contiene un file di sola lettura con lo stesso nome del file che stai cercando di copiare. Di default, Copy-Item non sovrascriverà questo file di sola lettura. Tuttavia, puoi sovrascrivere questo comportamento e forzare la sovrascrittura utilizzando il parametro -Force. Ecco un esempio di come usarlo:
Copy-Item -Path "C:\source\file.txt" -Destination "D:\destination" -Force
Copiare file e cartelle su computer remoti tramite Copy-Item
Anche se ci sono situazioni in cui potrebbe essere necessario copiare file e cartelle in diverse posizioni di unità su un computer locale, il vero punto di forza del cmdlet Copy-Item risiede nella sua capacità di facilitare il trasferimento di file e cartelle tra computer remoti.
Configurazione di una sessione remota con New-PSSession
Supponiamo che tu voglia copiare alcuni file su un computer remoto utilizzando PowerShell. Anche se potresti avere diritti di amministratore locale, il tuo account attuale potrebbe non avere i diritti adeguati sul computer di destinazione. Dovrai anche conoscere il computername della macchina remota. In questo caso, devi stabilire una sessione remota con il nuovo computer utilizzando credenziali alternative. Puoi eseguire la copia di file in cartella con PowerShell utilizzando il comando $session qui sotto.
$session = New-PSSession -ComputerName "RemotePC" -Credential "User"
Copiare file su un computer remoto
Ora puoi copiare i file sul computer remoto utilizzando la sessione stabilita.
Copy-Item -Path "C:\source\file.txt" -Destination "C:\remote\destination" -ToSession $session
Copiare file da un computer remoto
Naturalmente, potresti voler copiare file da un computer remoto al tuo computer locale. Per farlo, usa il seguente comando.
Copy-Item -Path "C:\remote\source\file.txt" -Destination "C:\local\destination" -FromSession $session
Copia ricorsiva di cartelle remote
Negli esempi precedenti che coinvolgevano computer remoti, le sottocartelle e i loro contenuti non erano inclusi nell'operazione di copia. Per includere l'intero contenuto del percorso dell'elemento sorgente, comprese tutte le sottocartelle e i file, aggiungi il parametro -Recurse al comando Copy-Item, proprio come abbiamo fatto con le operazioni di copia locali.
Copy-Item -Path "C:\remote\source\folder" -Destination "C:\local\destination" -FromSession $session -Recurse
Contenuto correlato selezionato:
Gestione degli errori e verifica
Utilizzo dei parametri WhatIf e Confirm
Il parametro WhatIf consente di verificare il risultato di un comando senza apportare modifiche. Ad esempio, come mostrato di seguito, potresti voler confermare che i percorsi di origine e destinazione siano corretti prima di eseguire l'operazione di copia.
Puoi anche controllare il comportamento di sovrascrittura, che mostra quali file verranno sovrascritti nella destinazione, aiutandoti a evitare perdite di dati non intenzionali. WhatIf ti aiuta a capire esattamente quali elementi verranno copiati. Il parametro del comando è mostrato di seguito.
Copy-Item -Path "C:\Source\File1.txt" -Destination "C:\Destination Two" -WhatIf
Di default, la maggior parte dei cmdlet di PowerShell apporta modifiche al sistema senza conferma da parte dell'utente. Potrebbero esserci casi in cui si desidera che l'utente confermi un'azione se viene eseguita. Il miglior esempio sarebbe se si utilizzasse PowerShell per rimuovere un file. Nell'esempio sottostante, si utilizza il comando confirm per richiedere la conferma all'utente.
Remove-Item -Path C:\file.txt -Confirm
Il comando verrà eseguito in PowerShell, come mostrato di seguito:
Puoi aggiungere il parametro -Confirm a qualsiasi comando Copy-Item.
Verifica del processo di copia
Quando si utilizza PowerShell per eseguire il backup di file critici, potrebbe essere necessario verificare che il processo di copia sia avvenuto. È possibile creare uno script PowerShell semplice, come quello di seguito, per confermare la copia dei file confrontando il numero di file, le dimensioni e le date.
# Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Copy the files from source to destination
Copy-Item -Path $source\* -Destination $destination -Recurse
# Confirm the files were copied by checking if they exist in the destination folder
$sourceFiles = Get-ChildItem -Path $source
$allCopied = $true
foreach ($file in $sourceFiles) {
$destinationFile = Join-Path $destination $file.Name
if (Test-Path $destinationFile) {
Write-Host "File '$($file.Name)' was copied successfully."
} else {
Write-Host "File '$($file.Name)' failed to copy."
$allCopied = $false
}
}
if ($allCopied) {
Write-Host "All files copied successfully."
} else {
Write-Host "Some files failed to copy."
}
Gestione degli errori e dei tentativi di ripetizione
Potresti voler utilizzare la gestione degli errori per la copia di file di grandi dimensioni per garantire che i tuoi script funzionino correttamente e possano riprendersi da errori imprevisti. In PowerShell, il modo principale per gestire gli errori è attraverso i blocchi try-catch. Lo script sottostante utilizza il try-catch per gestire gli errori durante la copia dei file
# Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Function to copy files with error handling
function Copy-Files {
try {
# Copy files and set error action to stop failure
Copy-Item -Path $source\* -Destination $destination -Recurse -ErrorAction Stop
Write-Host "Files copied successfully."
}
catch {
# Log the error message
Write-Error "An error occurred while copying files: $($_.Exception.Message)"
# Perform additional actions, like retrying or logging
}
finally {
Write-Host "Copy operation complete."
}
}
# Execute the function
Copy-Files
Esempi pratici e casi d'uso del cmdlet Copy-Item
Esempi dettagliati di compiti comuni
- Copia dei file da un hard disk che sta per guastarsi: Un hard disk mostra segni di guasto e i file critici devono essere copiati in una posizione sicura prima che l'unità si guasti.
- Automazione del backup per le modifiche giornaliere dei file: Per il recupero dei dati in caso di disastro, un'azienda potrebbe dover eseguire il backup di tutti i file in una directory critica su un server di backup.
- Migrazione da un server On-Prem a Cloud Storage: Un'azienda potrebbe voler migrare i documenti del proprio server locale da dischi locali a un provider di cloud storage come Azure o AWS.
- Distribuzione di File di Configurazione su Più Server: Un amministratore di sistema desidera distribuire file di configurazione aggiornati da
C:\ConfigUpdatesa un elenco di server remoti.
Scenari e soluzioni del mondo reale
Una struttura di file complessa può presentare alcune situazioni impegnative quando si utilizza il cmdlet Copy-Item. Ad esempio, i percorsi di file lunghi possono essere un problema per le versioni più vecchie di Windows che non supportano percorsi di file più lunghi di 260 caratteri. In quelle situazioni, potresti voler utilizzare percorsi UNC piuttosto che percorsi di file locali.
Potrebbero esserci casi in cui è necessario utilizzare il parametro -LiteralPath nel cmdlet Copy-Item. Questo potrebbe essere necessario quando il percorso contiene caratteri speciali (come [, ], o *) che PowerShell potrebbe altrimenti interpretare come caratteri jolly o sequenze di escape.
Anche i problemi di permesso sono un problema comune. Puoi utilizzare il parametro -Force per sovrascrivere alcune restrizioni o eseguire PowerShell come amministratore.
Contenuti correlati selezionati:
Script di esempio per l'automazione
È nel tuo interesse automatizzare il maggior numero possibile di compiti manuali per semplificarli ed evitare errori umani. Di seguito è riportato un esempio di uno script PowerShell utilizzato per eseguire il backup di una cartella in una directory di backup.
# Define source and destination directories
$sourcePath = "C:\SourceDirectory"
$backupPath = "D:\BackupDirectory"
# Get current timestamp to append to the backup folder
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
# Create a new folder for the current backup with timestamp
$backupDestination = "$backupPath\Backup_$timestamp"
New-Item -ItemType Directory -Path $backupDestination
# Copy all files and directories from the source to the backup folder
try {
Copy-Item -Path $sourcePath -Destination $backupDestination -Recurse -Force
Write-Output "Backup completed successfully on $(Get-Date)"
} catch {
Write-Output "An error occurred during the backup: $_"
}
# Optional: Clean up old backups (e.g., delete backups older than 30 days)
$daysToKeep = 30
$oldBackups = Get-ChildItem -Path $backupPath -Directory | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$daysToKeep) }
foreach ($backup in $oldBackups) {
try {
Remove-Item -Path $backup.FullName -Recurse -Force
Write-Output "Old backup removed: $($backup.FullName)"
} catch {
Write-Output "An error occurred while deleting old backups: $_"
}
}
Consigli e Migliori Pratiche
Migliori pratiche per l'utilizzo di Copy-Item
Anche se il cmdlet Copy-Item è semplice, ecco alcune delle migliori pratiche che potrebbero aiutarti in circostanze più complesse.
- Esegui PowerShell come Amministratore
- Utilizza il parametro -Recurse per copiare intere strutture di directory.
- Utilizza il parametro -Force con giudizio per evitare sovrascritture non intenzionali
- Quando si copiano directory di grandi dimensioni, prendere in considerazione alternative come Robocopy o altri strumenti più adatti per lavori di ampia portata.
- Considerate l'uso di -WhatIf per testare i vostri comandi per vedere cosa potrebbe succedere senza apportare modifiche reali.
Errori comuni e come evitarli
Oltre alle migliori pratiche, dovresti anche tenere a mente queste insidie comuni quando utilizzi lo scripting di PowerShell:
- Evitate di usare percorsi errati o relativi che non si risolvono come previsto utilizzando percorsi completi
- È facile dimenticare le sottodirectory sottostanti, quindi usa il parametro -Recurse per assicurarti che tutti i file contenuti nella directory principale vengano copiati.
- Le autorizzazioni insufficienti impediranno di completare le operazioni di copia, specialmente quando sono coinvolti computer remoti. Assicurati di avere le autorizzazioni appropriate e utilizza privilegi elevati quando necessario.
- Quando le operazioni di copia complesse non vengono completate correttamente, utilizza blocchi try-catch e implementa un adeguato registro degli errori.
Considerazioni sulle prestazioni e ottimizzazioni
Copiare set di dati sostanziali può consumare molta potenza di elaborazione sul tuo computer. Il parallel processing è una tecnica di calcolo che implica la suddivisione di un compito in parti più piccole ed eseguirle simultaneamente su più processori o core. Il parallel processing può migliorare significativamente le prestazioni quando applicato a operazioni sui file come quelle eseguite dal cmdlet Copy-Item. Invece di copiare i file uno alla volta in sequenza, il parallel processing permette di copiare più file contemporaneamente, sfruttando la capacità totale dei moderni processori multi-core. Questo approccio può ridurre drasticamente il tempo richiesto per grandi operazioni di copia, poiché sfrutta le risorse di sistema disponibili in modo più efficiente. Sebbene il cmdlet Copy-Item non supporti nativamente il parallel processing, PowerShell fornisce meccanismi come ForEach-Object -Parallel che possono essere utilizzati con Copy-Item per ottenere la copia parallela dei file. Questo può potenzialmente fornire notevoli guadagni di prestazioni in scenari che coinvolgono numerosi file o gerarchie di directory complesse. Un esempio base è mostrato di seguito:
<$sourcePath = "C:\SourceFolder"
$destPath = "D:\DestinationFolder"
Get-ChildItem $sourcePath | ForEach-Object -Parallel {
Copy-Item $_.FullName -Destination $using:destPath -Force
} -ThrottleLimit 8
Conclusione
Il comando cmdlet Copy-Item è uno strumento versatile in PowerShell per la gestione delle operazioni su file e directory. Dispone di una varietà di parametri per coprire molteplici situazioni, come la capacità di specificare un percorso di copia dell'elemento e implementare la gestione degli errori. Che tu stia utilizzando uno script PowerShell per copiare file dalla sorgente alla destinazione o per copiare file localmente o attraverso sistemi remoti, il cmdlet Copy-Item può eseguire funzioni di copia essenziali in modo efficiente. Considera l'implementazione dell'elaborazione parallela per migliorare le prestazioni per set di dati grandi e complessi o esplora strumenti specializzati progettati per la gestione di trasferimenti di dati estensivi. Padronizzare il cmdlet Copy-Item assicura trasferimenti di file accurati, rendendolo un componente essenziale del toolkit di qualsiasi utente PowerShell, mentre la comprensione dei suoi limiti permette di prendere decisioni informate su quando impiegare metodi alternativi.
Condividi su
Scopri di più
Informazioni sull'autore
Kevin Horvatin
Lead Software Architect
Kevin Horvatin è Lead Software Architect presso Netwrix ed è responsabile per Netwrix Privilege Secure. Sviluppatore software da oltre 20 anni, lavora con PowerShell e C# da quando sono stati introdotti.
Scopri di più su questo argomento
Powershell Elimina il file se esiste
PowerShell Write to File: "Out-File" e Tecniche di Output del File
Come creare nuovi utenti di Active Directory con PowerShell
Come eseguire uno script PowerShell
Cos'è PowerShell? Una guida completa alle sue funzionalità e utilizzi