Condividi tramite


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.