Wysyłanie parametrów do komputerów zdalnych w programie Windows PowerShell

Ukończone

Wiesz już, że polecenie Invoke-Command nie może zawierać zmiennych w jego bloku skryptu lub pliku skryptu, chyba że komputer zdalny może zrozumieć te zmienne. W związku z tym może się wydawać bardziej skomplikowane, aby znaleźć sposób przekazywania danych z komputera inicjującego do komputera zdalnego. Jednak polecenie Invoke faktycznie zapewnia określony mechanizm wykonywania tego zadania.

Aby sprawdzić, intencją następującego polecenia jest wyświetlenie listy 10 najnowszych wpisów dziennika zdarzeń zabezpieczeń na każdym komputerze docelowym. Jednak polecenie nie będzie działać zgodnie z zapisem:

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Get-EventLog –LogName $Log –Newest $Quantity
}

Problem polega na tym, że zmienne $Log i $Quantity mają znaczenie tylko na komputerze lokalnym, a te wartości nie są wstawiane do bloku skryptu przed wysłaniem tych wartości do komputerów zdalnych. W związku z tym komputery zdalne nie wiedzą, co oznaczają.

Poprawna składnia tego polecenia jest następująca:

$Log = 'Security'
$Quantity = 10
Invoke-Command –Computer ONE,TWO –ScriptBlock {
  Param($x,$y) Get-EventLog –LogName $x –Newest $y
} –ArgumentList $Log,$Quantity

Przy użyciu tej składni zmienne lokalne są przekazywane do parametru ArgumentListpolecenia Invoke-Command. W bloku skryptu jest tworzony blok Param(), który zawiera taką samą liczbę zmiennych jak lista –ArgumentList wartości, które w tym przypadku są dwa. Należy pamiętać, że można przypisać dowolne nazwy do zmiennych w bloku Param(). Otrzymają dane z parametru ArgumentList na podstawie kolejności. Innymi słowy, ponieważ $Log został wymieniony jako pierwszy na ArgumentList, jego wartość zostanie przekazana do $x, ponieważ jest to pierwszy wpis w bloku Param(). Zmienne w bloku Param() mogą być następnie używane wewnątrz bloku skryptu, jak pokazano w przykładzie.

Ta składnia będzie działać w przypadku programu Windows PowerShell 2.0 i nowszych. Jednak program Windows PowerShell 3.0 wprowadził uproszczone podejście alternatywne. Jeśli masz zmienną $variablelokalną i chcesz uwzględnić jego zawartość w poleceniu, które zostanie uruchomione na komputerze zdalnym, możesz uruchomić następującą składnię:

Invoke-Command –ScriptBlock { Do-Something $Using:variable } –ComputerName REMOTE

Prefiks $Using: jest prawidłowo przetwarzany przez komputery lokalne i zdalne, co powoduje $Using:variable zastąpienie zawartości zmiennej $variablelokalnej .