Manipolazione diretta di elementi
Gli elementi visualizzati nelle unità di PowerShell, ad esempio i file e le cartelle o le chiavi del Registro di sistema, vengono chiamati Elementi in PowerShell. I cmdlet per lavorare con questo elemento hanno nel nome il sostantivo Item.
L'output del comando Get-Command -Noun Item
mostra che sono presenti nove cmdlet per gli elementi di PowerShell.
Get-Command -Noun Item
CommandType Name Definition
----------- ---- ----------
Cmdlet Clear-Item Clear-Item [-Path] <String[]...
Cmdlet Copy-Item Copy-Item [-Path] <String[]>...
Cmdlet Get-Item Get-Item [-Path] <String[]> ...
Cmdlet Invoke-Item Invoke-Item [-Path] <String[...
Cmdlet Move-Item Move-Item [-Path] <String[]>...
Cmdlet New-Item New-Item [-Path] <String[]> ...
Cmdlet Remove-Item Remove-Item [-Path] <String[...
Cmdlet Rename-Item Rename-Item [-Path] <String>...
Cmdlet Set-Item Set-Item [-Path] <String[]> ...
Creazione di nuovi elementi
Per creare un nuovo elemento nel file system, usare il cmdlet New-Item
. Includere il parametro Path con il percorso dell'elemento e il parametro ItemType con il valore File
o Directory
.
Ad esempio, per creare una nuova directory denominata New.Directory
nella directory C:\Temp
, digitare:
New-Item -Path C:\temp\New.Directory -ItemType Directory
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 11:29 AM New.Directory
Per creare un file, modificare il valore del parametro ItemType in File
. Ad esempio, per creare un file denominato file1.txt
nella directory New.Directory
, digitare:
New-Item -Path C:\temp\New.Directory\file1.txt -ItemType File
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2006-05-18 11:44 AM 0 file1
È possibile usare la stessa tecnica per creare una nuova chiave del Registro di sistema. Infatti, una chiave del Registro di sistema è più semplice da creare perché l'unico tipo di elemento nel Registro di sistema di Windows è una chiave. (Nel Registro di sistema, voci di registro sono le proprietà dell'elemento .) Ad esempio, per creare una chiave denominata _Test
nella sottochiave CurrentVersion
, digitare:
New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SKC VC Name Property
--- -- ---- --------
0 0 _Test {}
Quando si digita un percorso del registro di sistema, assicurarsi di includere i due punti (:
) nei nomi delle unità di PowerShell, HKLM:
e HKCU:
. Senza i due punti (":"), PowerShell non riconosce il nome dell'unità nel percorso.
Perché i valori del Registro di sistema non sono elementi
Quando si usa il cmdlet Get-ChildItem
per trovare gli elementi in una chiave del Registro di sistema, non verranno mai visualizzate le voci effettive del Registro di sistema o i relativi valori.
Ad esempio, la chiave del Registro di sistema HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
in genere contiene diverse voci del Registro di sistema che rappresentano le applicazioni eseguite all'avvio del sistema.
Tuttavia, quando si usa Get-ChildItem
per cercare gli elementi figlio nella chiave, tutto ciò che vedrai è la sottochiave OptionalComponents
della chiave.
Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
SKC VC Name Property
--- -- ---- --------
3 0 OptionalComponents {}
Anche se sarebbe utile considerare le voci del Registro di sistema come elementi, non è possibile specificare un percorso a una voce del Registro di sistema in modo da garantire che sia univoco. La notazione del percorso non distingue tra la sottochiave del Registro di sistema denominata Esegui e la voce del Registro di sistema (Predefinita) nella sottochiave Esegui.
Inoltre, poiché i nomi delle voci del Registro di sistema possono contenere il carattere barra rovesciata (\
), se le voci del Registro di sistema erano elementi, non è possibile usare la notazione del percorso per distinguere una voce del Registro di sistema denominata Windows\CurrentVersion\Run
dalla sottochiave che si trova in tale percorso.
Ridenominazione di elementi esistenti
Per modificare il nome di un file o di una cartella, usare il cmdlet Rename-Item
. Il comando seguente modifica il nome del file file1.txt
in fileOne.txt
.
Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt
Il cmdlet Rename-Item
può modificare il nome di un file o di una cartella, ma non può spostare un elemento. Il comando seguente non riesce perché tenta di spostare il file dalla directory New.Directory
alla directory Temp.
Rename-Item -Path C:\temp\New.Directory\fileOne.txt C:\temp\fileOne.txt
Rename-Item : can't rename because the target specified isn't a path.
At line:1 char:12
+ Rename-Item <<<< -Path C:\temp\New.Directory\fileOne C:\temp\fileOne.txt
Spostamento di elementi
Per spostare un file o una cartella, usare il cmdlet Move-Item
.
Ad esempio, il comando seguente sposta la directory New.Directory dalla directory C:\temp
alla radice dell'unità C:
. Per verificare che l'elemento sia stato spostato, includere il parametro PassThru del cmdlet Move-Item
. Senza PassThru, il cmdlet Move-Item
non visualizza alcun risultato.
Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
Directory: Microsoft.PowerShell.Core\FileSystem::C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 12:14 PM New.Directory
Copiare elementi
Se si ha familiarità con le operazioni di copia in altre shell, è possibile che il comportamento del cmdlet Copy-Item
in PowerShell sia insolito. Quando si copia un elemento da una posizione a un'altra, Copy-Item
non ne copia il contenuto per impostazione predefinita.
Ad esempio, se si copia la directory New.Directory
dall'unità C: nella directory C:\temp
, il comando ha esito positivo, ma i file nella directory New.Directory non vengono copiati.
Copy-Item -Path C:\New.Directory -Destination C:\temp
Se si visualizza il contenuto di C:\temp\New.Directory
, si scoprirà che non contiene file:
PS> Get-ChildItem -Path C:\temp\New.Directory
PS>
Perché il cmdlet Copy-Item
non copia il contenuto nella nuova posizione?
Il cmdlet Copy-Item
è stato progettato per essere generico; non è solo per copiare file e cartelle.
Inoltre, anche quando si copiano file e cartelle, è possibile copiare solo il contenitore e non gli elementi all'interno di esso.
Per copiare tutto il contenuto di una cartella, includere il parametro Recurse del cmdlet Copy-Item
nel comando. Se la directory è già stata copiata senza il relativo contenuto, aggiungere il parametro Force, che consente di sovrascrivere la cartella vuota.
Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -PassThru
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 1:53 PM New.Directory
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2006-05-18 11:44 AM 0 file1
Eliminazione di elementi
Per eliminare file e cartelle, usare il cmdlet Remove-Item
. I cmdlet di PowerShell, ad esempio Remove-Item
, che possono apportare modifiche significative e irreversibili richiedono spesso la conferma quando si immettono i comandi. Ad esempio, se si tenta di rimuovere la cartella New.Directory
, verrà richiesto di confermare il comando, perché la cartella contiene file:
Remove-Item C:\temp\New.Directory
Confirm
The item at C:\temp\New.Directory has children and the -Recurse parameter was not
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"):
Poiché Yes
è la risposta predefinita, per eliminare la cartella e i relativi file, premere il tasto INVIO. Per rimuovere la cartella senza confermare, usare il parametro Recurse.
Remove-Item C:\temp\New.Directory -Recurse
Esecuzione di elementi
PowerShell usa il cmdlet Invoke-Item
per eseguire un'azione predefinita per un file o una cartella. Questa azione predefinita è determinata dal gestore dell'applicazione predefinito nel Registro di sistema; l'effetto è uguale a se si fa doppio clic sull'elemento in Esplora file.
Si supponga, ad esempio, di eseguire il comando seguente:
Invoke-Item C:\WINDOWS
Viene visualizzata una finestra di Esplora file che si trova in C:\Windows
, proprio come se si fosse fatto doppio clic sulla cartella C:\Windows
.
Se si richiama il file Boot.ini
in un sistema prima di Windows Vista:
Invoke-Item C:\boot.ini
Se il tipo di file .ini
è associato al Blocco note, il file boot.ini
viene aperto nel Blocco note.