Centrum skryptów - Systemy operacyjne

Jak przy pomocy powłoki Windows PowerShell uruchomić tę samą kwerendę WMI na wielu komputerach?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak przy pomocy powłoki Windows PowerShell uruchomić tę samą kwerendę WMI na wielu komputerach?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chcę uruchomić te same kwerendy WMI na wielu komputerach w sieci. Czy mogę dokonać tego przy pomocy powłoki Windows PowerShell?

- KB

Cześć Skrypciarze! Pytanie

Cześć, KB,

Jest to nie tylko możliwe, ale i banalnie łatwe. Jeśli potraficie stworzyć plik tekstowy w Notatniku, potraficie uruchomić wiele kwerend na wielu serwerach. Tak naprawdę będziemy potrzebować dwóch plików tekstowych i skryptu, ale z tym też sobie chyba poradzicie. Oto cały kod:

$aryquery

= Get-Content -path c:\fso\query.txt

$computer

= Get-Content -path c:\fso\servers.txt

Foreach

($query in $aryQuery)

{

Get-WmiObject

-Query $query -computername $computer

}

Skrypt rozpoczyna się od wczytania dwóch plików tekstowych i umieszczenia wyników w tablicach ciągów tekstowych. W dalszej części znajduje się instrukcja ForEach, która służy do przejścia przez wszystkie kwerendy i wykonania ich.

Do odczytania plików tekstowych wykorzystujemy cmdlet Get-Content, w którym określamy ścieżkę do pliku tekstowego. Pierwszy odczytywany plik tekstowy zawiera kwerendy, które chcemy wykonać. Plik Query.txt został zaprezentowany poniżej:

Jak widać plik query.txt nie jest szczególnie skomplikowany. Stanowi po prostu kolekcję kwerend WMI. Dodatkową korzyścią jest to, że nie musimy nawet umieszczać kwerend w cudzysłowach ani przejmować się kwestią wielkości liter. Składnia tych kwerend jest dokładnie taka sama jak składnia w języku VBScript. W rzeczywistości gdybym to ja miał napisać ten skrypt (chwila moment, przecież to ja mam napisać ten skrypt), wykradłbym kilka kwerend z moich starych skryptów VBScript, dzięki czemu uniknąłbym ponownego wynajdowania koła (lub w tym przypadku kwerendy). Poniżej zobaczyć można kwerendę, którą zapożyczyłem z własnego skryptu VBScript:

Kolejny plik, który będzie nam potrzebny, nosi nazwę servers.txt. Ten plik będzie zawierał nazwy serwerów, na których chcemy uruchomić kwerendy. Jak widać, plik servers.txt to nic innego jak zwykła lista nazw serwerów. Niepotrzebne są żadne przecinki ani znaki cudzysłowu. A tak na marginesie, plik mógłby równie dobrze zawierać adresy IP:

Skoro uporaliśmy się już z obydwoma plikami, czas rozpocząć ich przetwarzanie. A zatem "otwórzmy wrota i rzućmy nań okiem" (oczywiście to tylko przenośnia, nie będziemy niczym rzucać). Do odczytania zawartości plików tekstowych użyjemy cmdletu Get-Content. Ponieważ dostępne są dwa pliki, cmdlet Get-Content wykorzystamy dwukrotnie:

$aryquery

= Get-Content -path c:\fso\query.txt

$computer

= Get-Content -path c:\fso\servers.txt

Zawartość pliku query.txt umieszczamy w zmiennej $aryquery, a zawartość pliku server.txt w zmiennej $computer. Być może niektórzy z Was zastanawiają się, dlaczego nazwałem jedną zmienną $aryquery, a drugą $computer. Odrobinę cierpliwości. Za chwilę wszystko stanie się jasne. Cmdlet Get-Content zawsze zwraca tablicę. W VBScript gdy słyszeliśmy słowo "tablica", natychmiast przychodziło nam na myśl FOR EACH NEXT . Natomiast w przypadku programu Windows PowerShell gdy słyszymy słowo "tablica", powinniśmy pomyśleć ForEach. A ponieważ mamy tablicę kwerend WMI, instrukcja ForEach posłuży nam do przejścia przez tablicę kwerend. Iterując po tablicy, będziemy wykonywać po kolei każdą z kwerend. Poszczególne kwerendy znajdujące się w naszej tablicy będziemy przechowywać w zmiennej $query:

ForEach

($query in $aryQuery)

Do wykonania kwerend WMI użyjemy cmdletu Get-WmiObject. Przy pomocy parametru -$query dostarczymy kwerendę, którą chcemy wykonać. W tym momencie sytuacja robi się naprawdę interesująca. Parametr -computername cmdletu Get-WmiObject może pobierać tablicę! Naprawdę! Może pobrać tablicę! To już trzy wykrzykniki! A teraz czwarty! Okay, wystarczy. Dlatego do nazwania zmiennej, w której przechowywana jest zawartość pliku servers.txt, nie użyłem przedrostka ary. Nie miałem zamiaru dokonywać iteracji po tej tablicy. Oto wykorzystana linia kodu:

Get-WmiObject

-Query $query -computername $computer

Uruchomienie tego skryptu może spowodować wyświetlenie dużej ilości danych wyjściowych, w związku z czym może pojawić się potrzeba zapisania ich w pliku. Możecie wykorzystać do tego celu strzałki przekierowania (>>) lub cmdlet out-file. W przypadku wykorzystania operatora >> kod wyglądałby podobnie do następującego:

Get-WmiObject

-Query $query -computername $computer >> c:\fso\output.txt

Jeśli dokonujecie zapisu do pliku output.txt, który w dodatku znajdować się będzie w folderze fso na dysku c, Wasze polecenie będzie wyglądało dokładnie tak samo, w przeciwnym wypadku będzie wyglądało nieco inaczej.

I to już całe rozwiązanie. To może być ostatni napisany przez Was skrypt WMI. Od tej pory możecie jedynie kopiować kwerendy WMI ze swoich starych skryptów VBScript i wklejać je do pliku query.txt. Oczywiście najprawdopodobniej to nie będzie ostatni napisany przez Was skrypt WMI, bowiem WMI to taka fajna sprawa.

Ed Wilson i Craig Liebendorfer, Skrypciarze

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne