Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa

Darmowa diagnoza laptopa

Dojazd do klienta bezpłatnie

Dojazd do klienta bezpłatnie

Laptopy zastępcze bezpłatnie

Laptopy zastępcze bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

CMD nie przekazuje parametrów do skryptu

Termin Definicja
CMD nie przekazuje parametrów do skryptu

CMD nie przekazuje parametrów do skryptu wskazuje na błędne odwołanie się do argumentów w pliku wsadowym (%1, %2 zamiast %*) lub brak cudzysłowów wokół parametrów zawierających spacje.

Czym jest problem z przekazywaniem parametrów w CMD

Komunikat lub sytuacja opisywana jako „CMD nie przekazuje parametrów do skryptu” oznacza, że uruchamiany plik wsadowy nie otrzymuje wartości wpisanych po jego nazwie albo korzysta z nich w sposób, który zmienia ich znaczenie. Parametrem może być ścieżka do pliku, nazwa katalogu, przełącznik działania programu, numer zadania lub dowolny tekst przekazany podczas wywołania skryptu. W środowisku Windows argumenty są dostępne w pliku .bat lub .cmd za pomocą oznaczeń pozycyjnych, takich jak %1, %2 i kolejne, natomiast %* odnosi się do całego zestawu argumentów przekazanych do skryptu.

Sam wiersz poleceń zwykle działa prawidłowo, lecz skrypt może odczytywać argument z niewłaściwej pozycji, pomijać go albo dzielić na kilka części. Szczególnie często występuje to wtedy, gdy parametr zawiera spacje, na przykład gdy przekazywana jest ścieżka w rodzaju C:\Dokumenty firmowe\Raporty. Bez odpowiedniego ujęcia w cudzysłowy system może potraktować poszczególne fragmenty jako oddzielne argumenty. W efekcie pierwszy parametr zawiera tylko część ścieżki, a następne wartości zostają przesunięte lub odczytane jako niezależne przełączniki.

Nie należy utożsamiać tego problemu z awarią samego interpretera poleceń. Przyczyną może być składnia wywołania, sposób zapisania parametrów w skrypcie, niewłaściwe użycie zmiennej, zagnieżdżenie jednego pliku wsadowego w drugim albo utrata cudzysłowów podczas przekazywania argumentów dalej. Ocena wymaga prześledzenia całego łańcucha: od polecenia wpisanego w konsoli, przez sposób uruchomienia pliku, aż po instrukcję, która wykorzystuje otrzymaną wartość.

Jak CMD interpretuje argumenty i czym różnią się poszczególne odwołania

W pliku wsadowym numerowane zmienne reprezentują argumenty według ich kolejności. Odwołanie %1 wskazuje pierwszą wartość po nazwie skryptu, %2 drugą, a kolejne oznaczenia odnoszą się do następnych pozycji. Przykładowe wywołanie:

raport.cmd dane.txt szczegoly

przekazuje do skryptu dwa argumenty. Pierwszy można odczytać przez %1, a drugi przez %2. Jeżeli w skrypcie oczekiwane są trzy wartości, lecz podczas uruchomienia podano tylko dwie, odwołanie do %3 pozostanie puste. Taki brak nie zawsze powoduje czytelny komunikat, ponieważ polecenie może zostać po prostu złożone w niepełnej postaci.

Inne znaczenie ma zapis %*. Nie oznacza on pierwszego parametru ani pojedynczej zmiennej, lecz wszystkie argumenty przekazane do bieżącego skryptu. Bywa użyteczny wtedy, gdy plik wsadowy pełni rolę pośrednika i ma przekazać dalej cały zestaw opcji bez analizowania każdej pozycji osobno. Jeżeli potrzebne jest przekazanie argumentów do kolejnego pliku wsadowego, znaczenie ma również użycie właściwego polecenia wywołującego. Bez call przejście do innego pliku wsadowego może zakończyć działanie bieżącego kontekstu zamiast powrócić do następnej instrukcji.

Cudzysłowy chronią argument zawierający spacje, ale same cudzysłowy mogą pozostać częścią wartości przekazanej do polecenia. Z tego powodu istotne jest rozróżnienie między sytuacją, w której parametr ma być traktowany jako jedna ścieżka, a sytuacją, w której program docelowy oczekuje tekstu bez znaków ograniczających. Pomocne bywa konsekwentne umieszczanie zmiennych w cudzysłowach, na przykład:

if exist "%~1" echo Plik lub katalog istnieje

W tym przykładzie zapis %~1 usuwa zewnętrzne cudzysłowy z pierwszego argumentu, jeśli zostały przekazane. Nie rozwiązuje to jednak wszystkich problemów, ponieważ błędne zagnieżdżenie cudzysłowów, znaki specjalne oraz wywołania realizowane wewnątrz bloków warunkowych mogą zmienić sposób interpretacji tekstu. Dodatkowej uwagi wymagają znaki takie jak &, |, <, >, ^ i %, które w określonych miejscach mają znaczenie składniowe dla CMD.

Typowe błędy powodujące utratę lub zniekształcenie parametrów

Jednym z podstawowych błędów jest odwołanie do niewłaściwej pozycji. Jeżeli skrypt zostanie uruchomiony z dodatkowym przełącznikiem na początku, wszystkie późniejsze argumenty przesuwają się o jedną pozycję. Podobny efekt występuje, gdy wywołanie zostało zmienione, lecz zawartość pliku wsadowego nadal zakłada poprzedni układ danych. Warto sprawdzić pełne polecenie uruchamiające oraz tymczasowo wyświetlić wartości za pomocą echo, aby ustalić, co faktycznie trafia do każdej zmiennej.

Częsta pomyłka polega na użyciu %* tam, gdzie potrzebny jest tylko jeden parametr, albo odwrotnie, na zastosowaniu %1 w roli całej listy argumentów. W przypadku przekazywania opcji do programu zewnętrznego może to prowadzić do pominięcia części polecenia. Należy także uważać na składnię rozszerzającą zmienne, między innymi %~dp1, %~n1 czy %~x1. Takie warianty wydobywają z argumentu odpowiednio element ścieżki, nazwę lub rozszerzenie, lecz nie zastępują pełnej wartości.

Problemy mogą pojawić się również przy użyciu set. Spacje umieszczone przed lub po znaku równości mogą stać się częścią wartości, a nietypowe znaki mogą zostać zinterpretowane przez powłokę. Bezpieczniejszą formę stanowi zapis:

set "folder=%~1"
echo Folder: "%folder%"

Znaczenie ma także opóźniona ekspansja zmiennych. W bloku otoczonym nawiasami wartość zmiennej zapisywanej i odczytywanej w tym samym przebiegu może zostać ustalona wcześniej, niż jest to oczekiwane. W takich przypadkach może być potrzebne świadome użycie składni z wykrzyknikami po włączeniu opóźnionej ekspansji, jednak wymaga to ostrożności, ponieważ wykrzyknik w przekazywanym tekście może zostać potraktowany jako część mechanizmu zmiennych.

Źródłem nieporozumień bywa też uruchamianie skryptu z poziomu skrótu, harmonogramu zadań lub innego programu. Wtedy katalog roboczy może być inny niż katalog pliku, a ścieżka zawierająca spacje może zostać zapisana bez pełnego ujęcia w cudzysłowy. Warto rozdzielić test wywołania od testu zawartości skryptu: najpierw sprawdzić prosty argument tekstowy, potem ścieżkę bez spacji, następnie ścieżkę ze spacjami i na końcu wartości zawierające znaki specjalne.

Kiedy trzeba skorzystać z pomocy serwisu - CMD nie przekazuje parametrów do skryptu

Do serwisu warto zgłosić problem wtedy, gdy skrypt wykonuje operacje na plikach, kopiach zapasowych, konfiguracji systemu albo automatyzacji pracy, a nieprawidłowe przekazanie argumentów może prowadzić do pomijania danych lub wykonywania poleceń na niewłaściwym katalogu. Szczególnej ostrożności wymagają skrypty uruchamiane automatycznie, ponieważ błąd może pozostawać niezauważony do chwili, w której procedura wykona zadanie na niezamierzonych zasobach.

Warszawskie Pogotowie Komputerowe 24/7 zajmuje się analizą takich usterek, a naprawy są zazwyczaj realizowane w ciągu do 3 dni roboczych. Przed przekazaniem sprzętu lub plików warto przygotować przykładowe polecenie uruchamiające, treść komunikatu, fragment skryptu odpowiedzialny za odczyt parametrów oraz informację, czy problem występuje w konsoli, w harmonogramie, czy tylko przy uruchamianiu z określonego skrótu.

W trakcie sprawdzania można odtworzyć wywołanie w kontrolowanych warunkach, wyświetlić wszystkie otrzymane argumenty, zweryfikować cudzysłowy i przeanalizować sposób przekazywania wartości między kolejnymi plikami wsadowymi. Należy również ustalić, czy problem wynika z samej składni CMD, z lokalizacji pliku, uprawnień użytkownika, kodowania znaków lub programu, który uruchamia skrypt. Takie rozdzielenie przyczyn pozwala uniknąć przypadkowych zmian w pliku i ułatwia przywrócenie prawidłowego działania automatyzacji.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę