about_Methods
Descrizione breve
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 CopyTo
metodo che copia il file rappresentato dall'oggetto FileInfo
.
Per ottenere i metodi di qualsiasi oggetto, usare il Get-Member
cmdlet . Utilizzare la 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 Get-Process
comando è racchiuso tra parentesi per assicurarsi che venga eseguito prima che venga richiamato il metodo Kill. Il Kill
metodo viene quindi richiamato sull'oggetto restituito Process
.
Un altro metodo molto utile è il Replace
metodo delle stringhe. Il Replace
metodo 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 process 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 CopyTo
metodo della FileInfo
classe 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 CopyTo
metodo per copiare il Final.txt
file nella C:\Bin
directory .
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
Nota
A differenza della modalità argomento di PowerShell, i metodi oggetto vengono eseguiti in modalità di espressione, ovvero un pass-through al framework .NET basato su PowerShell. In modalità espressione gli argomenti bareword (stringhe senza virgolette) non sono consentiti. È possibile osservare questa differenza quando si usa 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 CopyTo
metodo per copiare il Final.txt
file nella C:\Bin
directory e per sovrascrivere i file esistenti.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
Enumerazione member-access
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 $p
variabile .
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
Il comando successivo esegue il metodo Kill in tutti e tre i processi nella $p
variabile. Questo comando funziona anche se una raccolta di processi non dispone di un Kill
metodo.
$p.Kill()
Get-Process Notepad
Il Get-Process
comando conferma che il Kill
metodo 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 equivale funzionalmente all'uso del Foreach-Object
cmdlet 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. Ciò consente l'uso di due nuovi metodi quando si gestiscono raccolte ForEach
e Where
.
Sono disponibili altre informazioni su questi metodi in 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 meno specifico object
del metodo Bar .
[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 corrente. 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.