Wysyłanie parametrów do komputerów zdalnych w programie Windows PowerShell
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ą $variable
lokalną 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 $variable
lokalnej .