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, sono denominati Elementi in PowerShell. I cmdlet per gestire gli elementi includono il sostantivo Item nei relativi nomi.

L'output del Get-Command -Noun Item comando 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 New-Item cmdlet . 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 C:\Temp directory, 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 New.Directory 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. In realtà, una chiave è più facile da creare perché si tratta dell'unico tipo di elemento del Registro di sistema di Windows. Le voci del Registro di sistema sono proprietà degli elementi. Ad esempio, per creare una chiave denominata _Test nella CurrentVersion sottochiave, 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 HKLM: delle unità di PowerShell 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 Get-ChildItem cmdlet 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 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run del Registro di sistema contiene in genere 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 quello che vedrai è la OptionalComponents sottochiave 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 Run e la voce del Registro di sistema (Impostazione 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 Rename-Item cmdlet . Il comando seguente modifica il nome del file1.txt file in fileOne.txt.

Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt

Il Rename-Item cmdlet 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 New.Directory 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 Move-Item cmdlet .

Ad esempio, il comando seguente sposta la directory New.Directory dalla C:\temp directory alla radice dell'unità C: . Per verificare che l'elemento sia stato spostato, includere il parametro PassThru del Move-Item cmdlet . Senza PassThru, il Move-Item cmdlet 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

Copia di elementi

Se si ha familiarità con le operazioni di copia in altre shell, è possibile che il Copy-Item comportamento del cmdlet 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 New.Directory directory dall'unità C: alla C:\temp directory , 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 Copy-Item cmdlet non copia il contenuto nella nuova posizione?

Il Copy-Item cmdlet è stato progettato per essere generico. Non è solo per copiare file e cartelle. Inoltre, anche se si copiano file e cartelle, si potrebbe scegliere di copiare solo il contenitore e non gli elementi al suo interno.

Per copiare tutto il contenuto di una cartella, includere il parametro Recurse del Copy-Item cmdlet nel comando . Se è già stata copiata la directory senza il suo 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 Remove-Item cmdlet . I cmdlet di PowerShell, ad esempio Remove-Item, che possono apportare modifiche significative e irreversibili richiedono spesso una conferma quando si immettono i comandi. Ad esempio, se si tenta di rimuovere la New.Directory cartella, 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 INVIO. Per rimuovere la cartella senza confermare, usare il parametro Recurse.

Remove-Item C:\temp\New.Directory -Recurse

Esecuzione di elementi

PowerShell usa il Invoke-Item cmdlet per eseguire un'azione predefinita per un file o una cartella. L'azione predefinita è determinata dal gestore dell'applicazione predefinito nel Registro di sistema. L'effetto è identico a quello che si ottiene facendo 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 C:\Windows Esplora risorse, come se si fosse fatto doppio clic sulla C:\Windows cartella.

Se si richiama il Boot.ini file in un sistema prima di Windows Vista:

Invoke-Item C:\boot.ini

Se il .ini tipo di file è associato a Blocco note, il boot.ini file viene aperto in Blocco note.