Centrum Skryptów - Systemy Operacyjne

Szybkie odpowiedzi Skrypciarzy

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

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.

Zawartość strony
 Jak formatować daty w programie Windows PowerShell?   Jak formatować daty w programie Windows PowerShell?
 Funkcja Get-ProgID autorstwa Jamesa Brundage'a   Funkcja Get-ProgID autorstwa Jamesa Brundage'a
 Jak uruchomić ten skrypt na komputerze zdalnym?   Jak uruchomić ten skrypt na komputerze zdalnym?
 Używanie argumentów wiersza poleceń w plikach wsadowych   Używanie argumentów wiersza poleceń w plikach wsadowych
 Czy pomożecie mi w ulepszeniu mojego skryptu?   Czy pomożecie mi w ulepszeniu mojego skryptu?

Jak formatować daty w programie Windows PowerShell?

Cześć, Skrypciarze! Mam problem z formatowaniem daty w programie Windows PowerShell. Zależy mi na takim formacie, jak poniżej:

 

(Get-Date).AddDays(-1) | $_.ToString("yyyy-MM-dd")

Niestety uruchomienie takie polecenia powoduje błąd. Jedyny sposób na formatowanie, jaki udało mi się wymyślić, wymaga użycia trzech wierszy kodu:

$p= (Get-Date).AddDays(-1)

$p= $p.ToString("yyyy-MM-dd")

$p

Czy można skrócić ten kod o jeden wiersz?

— SA

Cześć, SA!

Czołem, tutaj skrypciarz Ed Wilson. Owszem, można zrobić to, na czym Ci zależy, w dwóch wierszach kodu, ale równie dobrze można to zrobić w jednym. Oto odpowiedni kod:

PS C:\> ((Get-Date).AddDays(-1)).ToString("yyyy-MM-dd")

2010-02-28

Należy jednak pamiętać, że po określeniu formatu daty nie mamy już obiektu dateTime, lecz ciąg znaków. Widać to poniżej:

PS C:\> (Get-Date -Format "yyyy-MM-dd").AddDays(-1)

Wywołanie metody nie powiodło się, ponieważ obiekt [System.String] nie zawiera metody o nazwie 'AddDays'.

At line:1 char:40

+ (Get-Date -Format "yyyy-MM-dd").AddDays <<<< (-1)

    + CategoryInfo          : InvalidOperation: (AddDays:String) [], RuntimeException

    + FullyQualifiedErrorId : MethodNotFound

Jak widać z informacji podanych w komunikacie o błędzie, obiekt system.string nie ma metody AddDays. Tak więc wyrażenie w pierwszych nawiasach zwraca ciąg znaków, a nie obiekt dateTime. Zaletą korzystania z metody ToString jest fakt, że możemy określić format, który chcemy pobrać. Dlatego też używamy metody AddDays obiektu dateTime do pobrania wczorajszej daty, a następnie grupujemy ten fragment przy użyciu nawiasów i wywołujemy metodę ToString.

 Do początku strony Do początku strony

 

Funkcja Get-ProgID autorstwa Jamesa Brundage'a

Cześć, Skrypciarze! Chodzi o obiekty COM. Pomyślałem, że to się może przydać. James Brundage opublikował funkcję Get-ProgID w blogu zespołu Windows PowerShell, która wydaje mi się całkiem ciekawa. Może komuś się przyda.

 

Get-ProgID| ?{$_.progid -match "application"} | sort

— DF

Cześć, DF!

Dzięki za informację. Masz rację. James pisze świetne skrypty.

 Do początku strony Do początku strony

 

Jak uruchomić ten skrypt na komputerze zdalnym?

Cześć, Skrypciarze! Mam proste pytanie. Wasz skrypt Jak przywrócić na komputerze listę systemowych źródeł danych DSN? (j.ang) działa świetnie na komputerze lokalnym. Czy można uruchomić go na komputerze zdalnym? Mam listę około stu komputerów, z których muszę uzyskać odpowiednie informacje. Co polecacie?

— MB

Cześć, MB!

Skrypt powinien zadziałać na komputerze zdalnym bez większych problemów. Musisz zmienić wartość zmiennej strComputer z kropki na nazwę komputera zdalnego. Widać to poniżej:

Const HKEY_LOCAL_MACHINE = &H80000002

             

            strComputer = "Komputer_zdalny"

             

            Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

             

            strKeyPath = "SOFTWARE\ODBC\ODBC.INI\ODBC DATA SOURCES"

             

            objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

             

            For i = 0 to Ubound(arrValueNames)

                strValueName = arrValueNames(i)

                objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue    

                Wscript.Echo strValueName & " -- " & strValue 

            Next

Skoro jednak chcesz uruchomić skrypt na stu komputerach zdalnych, ręczne wprowadzanie każdej nazwy zapewne niezbyt Ci się uśmiecha. Możesz więc umieścić sto nazw komputerów w pliku tekstowym. Albo jeszcze lepiej — użyć języka VBScript do wysłania kwerend o nazwy komputerów przechowywane w odpowiedniej jednostce OU usługi Active Directory. Tak czy inaczej, następnie należałoby do wykonania kwerendy użyć pętli For...Each...Next do przejścia przez zawartość pliku lub kolekcję nazw komputerów zwróconą z usługi Active Directory. Możliwe byłoby też użycie pętli Do...Until. W Repozytorium skryptów można znaleźć kilka szablonów, które ułatwią Ci rozpoczęcie. Jeden z nich zakłada użycie pliku tekstowego (j.ang), a inny powoduje wysłanie do usługi Active Directory kwerendy zwracającej listę komputerów w jednostne OU (j.ang.).

W Repozytorium skryptów dostępnych jest ponad 150 podobnych szablonów w języku VBScript (j.ang.), udostępniających różnorodną funkcjonalność.

 Do początku strony Do początku strony

 

Używanie argumentów wiersza poleceń w plikach wsadowych

Cześć, Skrypciarze! Mam plik wsadowy o długości jednego wiersza, który uruchamia polecenie programu Windows PowerShell w celu pobrania informacji o procesach uruchomionych na serwerze zdalnym, a następnie zapisuje wyniki w pliku tekstowym. Czy jest jakiś sposób, aby wyświetlany był monit o podanie nazwy serwera, co eliminowałoby konieczność ręcznego edytowania pliku za każdym razem, kiedy uruchamiam go na innym serwerze? W przeszłości używałem do tego pól wejściowych języka VBScript, ale nie umiem tego zrobić w programie Windows PowerShell. Oto mój plik wsadowy:

powershell.exe -command tasklist /S \\server1 > C:\output\server1.txt

— MO

Cześć, MO!

Używasz pliku wsadowego, musisz go więc tak zmodyfikować, aby przyjmował on argumenty wiersza poleceń. W plikach wsadowych argumenty wiersza poleceń podaje się za pośrednictwem parametrów. Kiedy polecenie jest uruchamiane z pliku wsadowego, powłoka zastępuje parametry w tekście polecenia odpowiednimi argumentami. Parametry pliku są poprzedzone znakiem procenta: %0, %1, %2 itd. Kolejność odpowiada kolejności podawania. Należy pamiętać, że %0 to w istocie nazwa skryptu. Tak więc pierwszym parametrem jest %1. W pliku wsadowym użyj parametru %1 jako nazwy serwera i podaj nazwę serwera w wierszu poleceń podczas wywoływania pliku wsadowego. Jednak na Twoim miejscu użyłbym usług zdalnych programu Windows PowerShell, co jest chyba łatwiejsze od bawienia się z plikami wsadowymi. Ale może to tylko moje odczucie.

 Do początku strony Do początku strony

 

Czy pomożecie mi w ulepszeniu mojego skryptu?

Cześć, Skrypciarze! Mam problem: Muszę utworzyć listę wszystkich plików w określonym folderze (łącznie z podfolderami) i uzyskać algorytm MD5 każdego z plików. Mój kod działa, ale utworzenie listy trzech tysięcy plików zajmuje mu 5 godzin. Czy pomożecie mi ulepszyć skrypt? Mój kod jest dostępny w Repozytoriom skryptów.

— EG

Cześć, EG!

Ciekawy skrypt! Opracowanie trzech tysięcy plików w 5 godzin, czyli 600 plików na godzinę lub 10 plików na minutę, to całkiem niezły wynik dla nieskompilowanego, interpretowanego skryptu. Szczerze mówiąc, Twój skrypt jest na tyle długi i skomplikowany, że uzyskanie choćby minimalnej poprawy wydajności wymagałoby długich testów. Zwróciłem uwagę, że w paru miejscach dwukrotnie tworzysz takie same obiekty, a ich wielokrotne używanie pozwoliłoby zaoszczędzić nieco czasu. Jednak tworzenie obiektów w języku VBScript jest z reguły i tak szybkie, więc oszczędność byłaby niewielka. Koniec końców byłoby to i tak czymś w rodzaju przemalowania dinozaura w barwy samochodu wyścigowego.

O wiele lepszym wyjściem byłoby napisanie podobnego programu w języku C++ lub po prostu wyszukanie odpowiedniego narzędzia do obsługi MD5 w Internecie. Z tego co wiem, dostępnych jest co najmniej kilkadziesiąt.

Uwaga: Możesz też sprawdzić na Forum Skrypciarzy, czy ktoś z użytkowników nie zna lepszego rozwiązania. Oto łącze do odpowiedniej dyskusji (j.ang.), widocznej też na obrazie poniżej.

I to już ostatnia z ekscytujących, szybkich piątkowych odpowiedzi. Jest to także koniec kolejnego pasjonującego tygodnia w Centrum Skryptów. W przyszłym tygodniu zajmiemy się… albo nie, zdradzimy to, kiedy przyjdzie pora.

Jeśli chcecie szybciej dowiadywać się, jakim tematom poświęcone będą kolejne artykuły, śledźcie nas w serwisie Twitter lub Facebook. W razie jakichkolwiek pytań piszcie do nas na adres scripter@microsoft.com lub publikujcie na oficjalnym forum skrypciarzy. Do zobaczenia jutro.

 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjne