Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Breve descrizione
Descrive come usare i metodi per eseguire azioni sugli oggetti in PowerShell.
Descrizione lunga
PowerShell usa oggetti per rappresentare gli elementi negli archivi dati o lo stato del computer. Ad esempio, gli oggetti FileInfo rappresentano i file nelle unità del file system e gli oggetti ProcessInfo rappresentano i processi nel computer.
Gli oggetti hanno proprietà, che archivia i dati relativi all'oggetto e i metodi che consentono di modificare l'oggetto.
Un "metodo" è un set di istruzioni che specificano un'azione che è possibile eseguire sull'oggetto. Ad esempio, l'oggetto FileInfo include il metodo CopyTo che copia il file rappresentato dall'oggetto FileInfo.
Per ottenere i metodi di qualsiasi oggetto, usare il cmdlet Get-Member. Utilizzare la relativa proprietà MemberType con il valore "Method". Il comando seguente ottiene i metodi degli oggetti di elaborazione.
Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
BeginErrorReadLine Method System.Void BeginErrorReadLine()
BeginOutputReadLine Method System.Void BeginOutputReadLine()
...
Kill Method System.Void Kill()
Refresh Method System.Void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), ...
WaitForInputIdle Method bool WaitForInputIdle(int millisecon...
Per eseguire o "richiamare" un metodo di un oggetto, digitare un punto (.), il nome del metodo e un set di parentesi "()". Se il metodo contiene argomenti, inserire i valori dell'argomento tra parentesi. Le parentesi sono necessarie per ogni chiamata al metodo, anche se non sono presenti argomenti. Se il metodo accetta più argomenti, devono essere separati da virgole.
Ad esempio, il comando seguente richiama il metodo Kill dei processi per terminare il processo del Blocco note nel computer.
$notepad = Get-Process notepad
$notepad.Kill()
Questo esempio può essere abbreviato combinando le istruzioni precedenti.
(Get-Process Notepad).Kill()
Il comando Get-Process è racchiuso tra parentesi per assicurarsi che venga eseguito prima che venga richiamato il metodo Kill. Il metodo Kill viene quindi richiamato sull'oggetto Process restituito.
Un altro metodo molto utile è il metodo Replace di stringhe. Il metodo Replace sostituisce il testo all'interno di una stringa. Nell'esempio seguente, il punto (.) può essere posizionato immediatamente dopo la citazione finale della stringa.
'this is rocket science'.Replace('rocket', 'rock')
this is rock science
Come illustrato negli esempi precedenti, è possibile richiamare un metodo su un oggetto che si ottiene usando un comando, un oggetto in una variabile o qualsiasi elemento che restituisce un oggetto ,ad esempio una stringa tra virgolette.
A partire da PowerShell 4.0, la chiamata al metodo tramite nomi di metodo dinamici è supportata.
Informazioni sui metodi
Per trovare le definizioni dei metodi di un oggetto, passare all'argomento della Guida per il tipo di oggetto e cercare la relativa pagina dei metodi. Nella pagina seguente, ad esempio, vengono descritti i metodi degli oggetti processo System.Diagnostics.Process.
Per determinare gli argomenti di un metodo, esaminare la definizione del metodo, simile al diagramma della sintassi di un cmdlet di PowerShell.
Una definizione di metodo può avere una o più firme di metodo, come i set di parametri dei cmdlet di PowerShell. Le firme mostrano tutti i formati validi dei comandi per richiamare il metodo .
Ad esempio, il metodo CopyTo della classe FileInfo contiene le due firme del metodo seguenti:
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
La prima firma del metodo accetta il nome del file di destinazione (e un percorso). Nell'esempio seguente viene utilizzato il primo metodo CopyTo per copiare il file Final.txt nella directory C:\Bin.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Annotazioni
A differenza dell'argomento di PowerShell modalità, i metodi oggetto vengono eseguiti in modalità di di espressione, ovvero un pass-through al framework .NET su cui è basato PowerShell. In modalità espressione argomenti bareword (stringhe senza virgolette) non sono consentiti. È possibile notare questa differenza quando si utilizza il percorso come parametro, rispetto al percorso come argomento. Altre informazioni sulle modalità di analisi sono disponibili in about_Parsing
La seconda firma del metodo accetta un nome di file di destinazione e un valore booleano che determina se il file di destinazione deve essere sovrascritto, se esiste già.
Nell'esempio seguente viene utilizzato il secondo metodo CopyTo per copiare il file Final.txt nella directory C:\Bin e sovrascrivere i file esistenti.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
Enumerazione dell'accesso ai membri
A partire da PowerShell 3.0, quando si usa l'operatore di accesso ai membri (.) per accedere a un metodo che non esiste in una raccolta di elenchi, PowerShell enumera automaticamente gli elementi nella raccolta e richiama il metodo su ogni elemento. Per altre informazioni, vedere about_Member-Access_Enumeration.
Esempi
Nell'esempio seguente viene eseguito il metodo Kill di singoli oggetti processo in una raccolta di oggetti .
Il primo comando avvia tre istanze del processo del Blocco note.
Get-Process ottiene tutte e tre le istanze del processo blocco note e le salva nella variabile $p.
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
Il comando successivo esegue il metodo Kill su tutti e tre i processi nella variabile $p. Questo comando funziona anche se una raccolta di processi non dispone di un metodo Kill.
$p.Kill()
Get-Process Notepad
Il comando Get-Process conferma che il metodo Kill ha funzionato.
Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<< notepad
+ CategoryInfo : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand
Questo esempio è funzionalmente equivalente all'uso del cmdlet Foreach-Object per eseguire il metodo su ogni oggetto dell'insieme.
$p | ForEach-Object {$_.Kill()}
Metodi ForEach e Where
A partire da PowerShell 4.0, è supportato il filtro delle raccolte usando una sintassi del metodo. In questo modo è possibile usare due nuovi metodi quando si gestiscono raccolte ForEach e Where.
Per altre informazioni su questi metodi, vedere about_arrays
Chiamata di un metodo specifico quando esistono più overload
Si consideri lo scenario seguente quando si chiamano i metodi .NET. Se un metodo accetta un oggetto ma ha un overload tramite un'interfaccia che accetta un tipo più specifico, PowerShell sceglie il metodo che accetta l'oggetto a meno che non venga eseguito in modo esplicito il cast a tale interfaccia.
Add-Type -TypeDefinition @'
// Interface
public interface IFoo {
string Bar(int p);
}
// Type that implements the interface
public class Foo : IFoo {
// Direct member method named 'Bar'
public string Bar(object p) { return $"object: {p}"; }
// *Explicit* implementation of IFoo's 'Bar' method().
string IFoo.Bar(int p) {
return $"int: {p}";
}
}
'@
In questo esempio è stato scelto l'overload object meno specifico del metodo barra.
[Foo]::new().Bar(1)
object: 1
In questo esempio viene eseguito il cast del metodo all'interfaccia IFoo per selezionare l'overload più specifico del metodo bar.
([IFoo] [Foo]::new()).Bar(1)
int: 1
Uso di metodi .NET che accettano percorsi del file system
PowerShell supporta più spazi di esecuzione per processo. Ogni spazio di esecuzione ha la propria directory attuale. Non corrisponde alla directory di lavoro del processo corrente: [System.Environment]::CurrentDirectory.
I metodi .NET usano la directory di lavoro del processo. I cmdlet di PowerShell usano il percorso runspace. Inoltre, i metodi .NET funzionano solo con i percorsi del file system nativo, non con gli oggetti Percorso di PowerShell. Per usare i percorsi di PowerShell con i metodi .NET, è necessario risolvere il percorso di un percorso nativo del file system prima di passarlo al metodo .NET.