Centrum skryptów - Systemy operacyjne

Jak mogę przekazać dane z jednego skryptu do drugiego? 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 mogę przekazać dane z jednego skryptu do drugiego?

Cześć Skrypciarzu! Jakiś czas temu pokazywałeś jak użyć funkcji InputBox, by wyświetlić użytkownikowi monit o wprowadzenie wartości, którą możemy potem wykorzystać w skrypcie. Chciałbym się dowiedzieć, czy istnieje sposób na to, żeby użyć tej wartości w innym skrypcie?

-- JW

Cześć JW! Jak sądzimy, chcesz mieć skrypt, który, między innymi, polecałby użytkownikowi wprowadzenie jakichś danych. Chcesz również móc uruchomić drugi skrypt i umożliwić mu dostęp do danych wprowadzonych do pierwszego skryptu. A przede wszystkim chcesz wiedzieć, czy to jest w ogóle możliwe.

Odpowiedź brzmi (napięcie sięga zenitu, czyż nie?): w pewnym sensie. Załóżmy, że uruchamiasz Skrypt A i wprowadzasz do niego wartość. Czy niezależnie od tego możesz teraz uruchomić Skrypt B i w jakiś sposób sprawić, żeby Skrypt B połączył się ze Skryptem A i pobrał tę wartość? Nie; to byłaby bardziej magia niż skrypty. Istnieje jednakże na to pewien sposób: uruchamiasz Skrypt A i sprawiasz by użytkownik wprowadził wartość. Następnie przy pomocy Skryptu A uruchamiasz Skrypt B; gdy to zrobisz, będziesz mógł przekazać dane do Skryptu B. Dzięki temu Skrypt B będzie miał pełen dostęp do wszystkich informacji wprowadzonych przez użytkownika.

Dla lepszego wyjaśnienia spójrzmy na bardzo prosty przykład. Potrzebujemy dwóch skryptów: Skryptu A i Skryptu B. Gdy uruchomimy Skrypt A, poleci on użytkownikowi, by wprowadził liczbę. Następnie Skrypt A uruchomi Skrypt B; w momencie uruchomienia Skrypt A przekaże wprowadzoną liczbę. Skrypt B pobierze liczbę, wyliczy pierwiastek kwadratowy i poda odpowiedź.

Uwaga. Czy w takim wypadku nie byłoby łatwiej mieć tylko jeden skrypt, który przyjmowałby dane wprowadzone przez użytkownika oraz wyliczał pierwiastek kwadratowy? Owszem. Pamiętaj jednak, że jest to tylko skrypt pokazowy, zaprojektowany by pokazać Ci w jaki sposób przekazywać dane z jednego skryptu do drugiego; nie jest przeznaczony do praktycznego użytku.

Oto Skrypt A. Zauważ, że rozpoczyna on działanie od utworzenia wystąpienia obiektu WSH Shell; obiekt ten zostanie użyty później do uruchomienia Skryptu B (który nazwiemy output.vbs; Skrypt A będzie nosił nazwę input.vbs). Następnie używamy funkcji InputBox by poprosić użytkownika o wprowadzenie liczby:

Set objShell = CreateObject("Wscript.Shell")



intValue = InputBox("Please enter a number:")

strCommandLine = "output.vbs " & intValue

objShell.Run(strCommandLine)

Zwróć uwagę na to, co robimy po wprowadzeniu przez użytkownika liczby (przyjmijmy, że użytkownik wprowadził liczbę 2). Mamy następujący wiersz kodu:

strCommandLine = "output.vbs " & intValue

Ten kod tworzy polecenie uruchamiające Skrypt B. Załóżmy, że chciałbyś uruchomić Skrypt B i przekazać do niego liczbę 2 jako argument wiersza poleceń. W tym celu w konsoli tekstowej wpisujesz:

output.vbs 2

Tworzymy tu ciąg zawierający dwa elementy: nazwę skryptu, który uruchamiamy (output.vbs) oraz argument wiersza poleceń, który przekazujemy (2). Oczywiście nie wiemy, że argument wynosi właśnie 2; po prostu przekazujemy każdą wartość wprowadzoną przez użytkownika. Dlatego właśnie wstawiamy zmienną intValue. Zauważ również, że output.vbs (plus puste miejsce) jest zamieszczone w cudzysłowie, a zmienna intValue poza nim. Dlaczego intValue znajduje się poza cudzysłowem? To proste; gdyby intValue znalazł się w cudzysłowie, otrzymalibyśmy komendę, która nie przekazywałaby liczby 2 (czy jakiejkolwiek innej wprowadzonej liczby), tylko wartość ciągu intValue:

output.vbs intValue

Nie o to nam chodzi.

Po utworzeniu wiersza poleceń używamy metody Run (uruchom) by uruchomić Skrypt B, przekazując wprowadzoną przez użytkownika wartość jako argument wiersza poleceń.

Jak zatem wygląda Skrypt B? Coś w tym stylu:

intValue = Wscript.Arguments.Item(0)

intSquareRoot = Sqr(intValue)



Msgbox "The square root of " & intValue & _

    " is " & intSquareRoot & "."

Jak widzisz, możemy przypisać pierwszy (a w tym wypadku jedyny) argument wiersza poleceń do zmiennej intValue. Następnie używamy funkcji Sqr by obliczyć pierwiastek kwadratowy tej wartości. Na koniec wyświetlamy odpowiedź. W tym wypadku użyliśmy funkcji VBScript o nazwie Msgbox (jako przeciwieństwa Wscript.Echo) aby upewnić się, że odpowiedź zostanie wyświetlona w oknie komunikatu. Gdybyśmy użyli Wscript.Echo, a domyślnym hostem skryptów byłby Cscript, okno poleceń otworzyłoby się na ułamek sekundy, odpowiedź pojawiłaby się na ekranie i zniknęła, zanim w ogóle zdążyłbyś ją zobaczyć. Msgbox wyświetla dane w oknie komunikatu, bez względu na host skryptów.

Przykład znów bardzo prosty, ale można go łatwo rozszerzyć tak, żeby wysyłał dwa, trzy, cztery czy każdą dowolną liczbę argumentów wiersza poleceń ze Skryptu A do Skryptu B. Działa bez zarzutu, choć teoretycznie, przekazując zbyt wiele danych, mógłbyś napotkać ograniczenie długości ciągu polecenia. W takim wypadku najlepiej będzie, gdy zapiszesz dane ze Skryptu A do pliku tekstowego, z którego odczyta je Skrypt B.

Uważaj również na skrypty, które wysyłają argumenty wiersza poleceń zawierające spacje. Na przykład, załóżmy, że chcesz wysłać nazwę Ken Myer do Skryptu B. Polecenie nie zadziała; wyśle dwa argumenty (Ken i Myer) zamiast pojedynczego argumentu Ken Myer:

output.vbs Ken Myer

Z powodu spacji (WSH używa spacji do określenia, gdzie kończy się jeden argument, a zaczyna drugi) wyrazy Ken i Myer muszą znaleźć się w cudzysłowie, tak jak tu:

output.vbs "Ken Myer"

To z kolei oznacza, że utworzony przez Ciebie ciąg polecenia również musi zawierać cudzysłowy. Oto jeden ze sposobów (więcej znajdziesz w tej rubryce z archiwum Skrypciarzy (j.ang.)):

strCommandLine = "output.vbs " & chr(34) & strValue & chr(34)

W tym przykładzie każde wystąpienie chr(34) wstawia cudzysłów. Tym samym otrzymujemy output.vbs plus " plus Ken Myer plus " lub też:

output.vbs "Ken Myer"

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne