Centrum Skrypciarzy - Systemy Operacyjne

Jak sprawić, by okno poleceń się nie zamknęło po uruchomieniu skryptu za pomocą opcji „Otwórz używając wiersza poleceń”?

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 sprawić, by okno poleceń się nie zamknęło po uruchomieniu skryptu za pomocą opcji „Otwórz używając wiersza poleceń”?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak sprawić, by okno poleceń się nie zamknęło po uruchomieniu skryptu za pomocą opcji „Otwórz używając wiersza poleceń”?

-- BB

Cześć Skrypciarze! Odpowiedź

Cześć, BB. Skrypciarz piszący te słowa od kilku dni jest na diecie. Nie jest to wcale zwykła dieta, ale taka, która ma na celu poprawę ogólnego samopoczucia, wyrównanie procesów życiowych i generalnie wpłynąć pozytywnie na jego zdrowie. I wcale nie chodzi o to, żeby zrzucać jakieś zbędne kilogramy; wszyscy dookoła mogą poświadczyć, że piszący te słowa Skrypciarz nie ma się czego pozbywać.

W związku z tym, że dieta nazywa się dietą, nasz Skrypciarz ma problemy z jej utrzymaniem, zwłaszcza, że nikt mu w tym nie pomaga. Wszyscy jak na złość objadają się bardzo niezdrowymi rzeczami i wszelkiego rodzaju słodyczami, a on chrupie tę swoją marchewkę. Z racji tego, że dieta ta już trwa ładnych parę dni, piszący te słowa Skrypciarz zdążył już wymyślić na jej temat kilka teorii. Jedna z nich głosi, że ze zdrową dietą jest jak z oknem poleceń. Nad udowodnieniem tej tezy musi się jednak jeszcze zastanowić. Tymczasem całą swoją energię skupił na odpowiedzi na pytanie zadane przez BB.

A swoją drogą to dobre pytanie.

Po kliknięciu prawym klawiszem myszy na plik VBS pojawi się m.in. opcja Otwórz używając wiersza poleceń. Jeżeli ją wybierzemy, coś na pewno się wydarzy: zazwyczaj okno poleceń pojawi się na chwilę na ekranie i równie szybko zniknie. I to wszystko. Dlaczego skrypt się nie uruchamia i dlaczego okno poleceń się zamyka?

Po kolei. Pierwsze pytanie. (To trochę niezwykłe podejście jak na rubrykę Cześć Skrypciarze!, nieprawdaż?) Jak się okazuje, skrypt tak naprawdę działa; chodzi o to, że wiele skryptów VBScript jest wykonywanych tak szybko, że nie zdajemy sobie sprawy, że coś się stało. (Mniej więcej w tym samym czasie, kiedy pojawia się na ekranie okno poleceń, skrypt kończy swoje zadania i jest już pora na jego zamknięcie.) Jest tylko jeden sposób, żeby to zmienić. Musimy utworzyć prosty skrypt, który ni mniej ni więcej, tylko wyświetli pole wiadomości:

Msgbox "Hey"

Teraz klikamy prawym klawiszem myszy na ten plik .VBS i wybieramy opcję Otwórz używając wiersza poleceń. Powinniśmy zobaczyć pole wiadomości z informacją, że skrypt naprawdę zadziałał...

Dlaczego zatem okno poleceń się zamknęło? To proste: domyślnie, okno poleceń robi swoje i znika. Dla przykładu, otwieramy okno dialogowe Uruchom, wpisujemy ipconfig i naciskamy ENTER. Zobaczymy otwierające się okno poleceń oraz – jeżeli mamy dobry wzrok – uruchomiony program Ipconfig.exe. Jednak w momencie zakończenia działania programu Ipconfig, okno poleceń automatycznie się zamknie. Dlatego zazwyczaj mówimy o tym, aby najpierw otwierać okno poleceń, a dopiero potem uruchamiać skrypt lub narzędzie linii poleceń. Jeżeli tak nie zrobimy, skrypt lub narzędzie zadziała, ale my prawdopodobnie nigdy nie zobaczymy efektu tego działania. Czy otwarcie okna poleceń przed uruchomieniem z niego skryptu to jakiś problem? Oczywiście, że tak; w sumie to niszczy całą ideę posiadania skrótu Otwórz używając wiersza poleceń.

Jednak mamy dla Ciebie dobrą nowinę, BB: jeżeli nie podoba Ci się sposób działania skrótu Otwórz używając wiersza poleceń, możesz zmienić jego działanie. Jak to zrobić? Dobre pytanie: sugerujemy zastosowanie poniższego skryptu:

Const HKEY_CLASSES_ROOT = &H80000000



strComputer = "."

 

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

 

strKeyPath = "VBSFile\Shell\Open2\Command"

strValueName = ""

strValue = "cmd.exe /K cscript.exe " & Chr(34) & "%1" & Chr(34) & " %*" 



objRegistry.SetExpandedStringValue _

    HKEY_CLASSES_ROOT,strKeyPath,strValueName,strValue

Okazuje się, że zachowanie skrótu Otwórz używając wiersza poleceń jest określane przez ustawienia w rejestrze (HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command). Domyślnie, to ustawienie po prostu wywołuje aparat skryptów CScript lub WScript (w zależności od preferowanych ustawień), przekazując ścieżkę dostępu do pliku jako argument linii poleceń:

%SystemRoot%\System32\CScript.exe "%1" %*

Jeżeli chcemy, aby okno poleceń było stale otwarte za każdym razem, gdy używamy tego skrótu, musimy zmodyfikować te ustawienia rejestru. Jak to zrobimy? Właśnie miałem o tym mówić.

Kiedy patrzymy na nasz skrypt, widzimy, że zaczynamy od określenia stałej o nazwie HKEY_CLASSES_ROOT i nadajemy jej wartość &H80000000; użyjemy tej stałej, żeby przekazać skryptowi informację, z którym rojem rejestru chcemy pracować. Następnie łączymy się z usługą WMI na lokalnym komputerze i podłączamy do klasy StdRegProv. (Która znajduje się w przestrzeni nazw root\default.)

Uwaga:

Czy można zastosować ten skrypt w odniesieniu do zdalnych komputerów? Oczywiście, że tak. Wystarczy tylko przypisać nazwę zdalnego komputera do zmiennej o nazwie strComputer.

Po podłączeniu do usługi WMI, przypisujemy wartości do trzech zmiennych:

  • strKeyPath, która odpowiada ścieżce rejestru w roju HKEY_CLASSES_ROOT. W naszym przypadku ustawiamy ścieżkę na VBSFile\Shell\Open2\Command.
  • strValueName, która odpowiada bieżącej wartości rejestru, którą chcemy zmodyfikować. Jak się okazuje, chcemy zmodyfikować wartość domyślną, która w Regedit występuje jako: (Default). Jak mamy zaznaczyć, że chcemy zmodyfikować właśnie tę wartość domyślną? To proste: przypisujemy do zmiennej strValueName pusty ciąg („”).
  • strValue, odpowiadająca nowej wartości, którą chcemy wpisać do rejestru.

Pomówmy przez chwilę o zmiennej strValue. Jak wspomnieliśmy wcześniej, okno poleceń otwiera się, robi swoje i znika. Jednak jest pewien sposób na zatrzymanie otwartego okna poleceń po zakończeniu wyznaczonych zadań: podczas otwierania okna należy zastosować przełącznik /K (od keep). I to właśnie tutaj robimy. Zauważmy jednak, że tym razem nie rozpoczynamy bezpośrednio od CScript.exe. Zamiast tego otwieramy okno poleceń (Cmd.exe) i używamy przełącznika /K, żeby upewnić się, że okno się nie zamknie. To tego posłuży nam ten fragment kodu:

cmd.exe /K

Następnie przekazujemy nazwę hosta skryptu (CScript.exe) oraz ścieżkę dostępu do pliku jako dodatkowe argumenty linii poleceń do polecenia Cmd.exe. Innymi słowy, za każdym razem, gdy ktoś wybierze opcję Otwórz używając wiersza poleceń, otworzy się nieznikająca wersja okna poleceń, a następnie przekazana zostanie do niego informacja, że – kiedy się otworzy – ma uruchomić CScript.exe oraz wybrany plik VBS.

Zagmatwane? Tak, przynajmniej troche. I nie pomoże tu wcale składnia naszego polecenia – zawierająca funkcję Chr(34), której używamy do wstawienia cudzysłowu do wartości ciągu. Tak, czy siak, zmienna strValue otrzymuje przypisaną następującą wartość:

cmd.exe /K cscript.exe "%1" %*

Możecie wierzyć lub nie, jest to polecenie, które „naprawi” skrót Otwórz używając wiersza poleceń. Tak naprawdę, po przypisaniu wartości do naszych zmiennych wystarczy tylko wywołać metodę SetExpandedStringValue (ponieważ tak się składa, że nasza wartość rejestru ma dane typu REG_EXPAND_SZ data type) i już gotowe:

objRegistry.SetExpandedStringValue _

    HKEY_CLASSES_ROOT,strKeyPath,strValueName,strValue

Spróbujmy teraz kliknąć prawym klawiszem myszy na plik VBS i wybrać opcję Otwórz używając wiersza poleceń. Ty razem powinno się otworzyć okno poleceń, powinien uruchomić się skrypt i – po zakończeniu działania – okno poleceń powinno pozostać otwarte. Słodkie, prawda?

 Do początku strony Do początku strony

Centrum Skrypciarzy - Systemy Operacyjne