Muszę sprawdzić, czy zmienna jest ustawiona, czy nie. Wypróbowałem kilka technik, ale wydaje się, że zawodzą, gdy %1
są otoczone cytatami, na przykład w przypadku, gdy %1
jest "c:\some path with spaces"
.
IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Według tej witryny są to obsługiwane IF
typy składni. Więc nie widzę sposobu, aby to zrobić.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
windows
shell
batch-file
cmd
blak3r
źródło
źródło
if "%1" == "" GOTO MyLabel
nie zabija śmiertelnie wykonywania skryptu, o ile%1
ma parzystą liczbę podwójnych cudzysłowów. Widzę, że nieparzysta liczba podwójnych cudzysłowów%1
zabija wykonanie skryptu z tym błędem:The syntax of the command is incorrect.
Poniższe rozwiązanie, które używa nawiasów kwadratowych do rozwiązania problemu, zostało oznaczone jako poprawna odpowiedź, ale wydaje się, że nie działa lepiej . To rozwiązanie również nie działa z tym samym błędem, gdy%1
zawiera nieparzystą liczbę podwójnych cudzysłowów.IF DEFINED
praca nad zmiennymi środowiskowymi zamiast zmiennymi skryptowymi jest marnowaniem potencjału!Odpowiedzi:
Użyj nawiasów kwadratowych zamiast cudzysłowów:
Nawiasy są niepewne : używaj tylko nawiasów kwadratowych.
źródło
&
w%1
przekroczy linięif #%1#==##
lubif [%1]==[]
jest dobre, o ile w argumencie nie ma spacji, w przeciwnym razie wystąpi…was unexpected at this time
błąd."%~1"
jest naprawdę lepszym podejściem, jak wspomniałem w mojej odpowiedzi.==
. Zamiast tego użyj jego odpowiedzi.it DOES NOT work with spaces
. Zamiast tego użyj odpowiedzi @jamesdlin.Możesz użyć:
aby usunąć zewnętrzny zestaw cytatów. Ogólnie rzecz biorąc, jest to bardziej niezawodna metoda niż stosowanie nawiasów kwadratowych, ponieważ będzie działać, nawet jeśli zmienna zawiera spacje.
źródło
~
, usuwasz zewnętrzne cytaty, jeśli są obecne, ale następnie dodajesz je z powrotem ręcznie (zapewniając tylko jeden zestaw). Co więcej, muszą używać cytatów jeśli argument zawiera spacje (Nauczyłem się tego na własnej skórze, kiedy moja poprzednia wersja użyciem#
lub nawiasach zamiast cudzysłowów spowodowanych argumenty ze spacjami rzucać…was unexpected at this time
błąd.)""this string will crash the comparison""
. Podwójny „” jest prawidłową sekwencją ucieczki, a wykonanie podstawienia na podwójnym „” nie powiedzie się, jeśli ciąg jest pusty"%~1"
.Jednym z najlepszych rozwiązań semi jest skopiowanie
%1
do zmiennej, a następnie użycie opóźnionego rozwinięcia, jako delayedExp. jest zawsze bezpieczny w przypadku jakichkolwiek treści.Zaletą tego jest to, że radzenie sobie z param1 jest całkowicie bezpieczne.
Ustawienie parametru param1 będzie działać w wielu przypadkach, na przykład
Ale nadal zawodzi z dziwnymi treściami takimi jak
Aby uzyskać 100% poprawną odpowiedź na istnienie
Wykrywa, czy
%1
jest pusty, ale w przypadku niektórych treści nie może pobrać zawartości.Może to być również przydatne do rozróżnienia pustego
%1
i jednego z""
.Wykorzystuje zdolność
CALL
polecenia do niepowodzenia bez przerywania pliku wsadowego.Jeśli chcesz być w 100% odporny na pociski, aby pobrać zawartość, przeczytaj artykuł Jak otrzymać nawet najdziwniejsze parametry wiersza poleceń?
źródło
Z IF / ?:
źródło
%1
polubień. „Zmienne zdefiniowane w pliku wsadowym” są w rzeczywistości zmiennymi środowiskowymi, gdy plik wsadowy jest uruchomiony i możnaIF DEFINED
z nich korzystać.Niestety nie mam wystarczającej reputacji, aby komentować lub głosować nad aktualnymi odpowiedziami, na które musiałem napisać własną.
Pierwotnie pytanie OP brzmiało „zmienna”, a nie „parametr”, co stało się bardzo mylące, zwłaszcza, że był to numer jeden w wyszukiwarce Google do wyszukiwania pustych zmiennych. Od czasu mojej pierwotnej odpowiedzi Stephan zredagował pierwotne pytanie, aby użyć poprawnej terminologii, ale zamiast usunąć moją odpowiedź, postanowiłem ją zostawić, aby pomóc w rozwiązaniu wszelkich nieporozumień, szczególnie w przypadku, gdy Google nadal wysyła tu ludzi po zmienne:
% 1 NIE JEST ZMIENNY! TO PARAMETR LINII POLECEŃ.
Bardzo ważne rozróżnienie. Pojedynczy znak procentu z liczbą po odnosi się do parametru wiersza polecenia, a nie zmiennej.
Zmienne są ustawiane za pomocą polecenia set i są przywoływane przy użyciu 2 znaków procentowych - jeden przed, a drugi po. Na przykład% myvar%
Aby przetestować pustą zmienną, użyj składni „jeśli nie zdefiniowano” (polecenia jawnie dla zmiennych nie wymagają żadnych znaków procentu), na przykład:
(Jeśli chcesz przetestować parametry wiersza poleceń, polecam odnieść się do odpowiedzi jamesdlin.)
źródło
if variable is empty
doif parameter is empty
. Właśnie to zrobiłem. (istnieje ryzyko unieważnienia niektórych odpowiedzi, które sprawdziły zmienne zamiast parametrów, a więc i tak są nieprawidłowe, ponieważ nie odpowiedziały na pytanie)Użyj „JEŚLI DEFINIOWANE polecenie zmiennej”, aby przetestować zmienną w pliku wsadowym.
Ale jeśli chcesz przetestować parametry partii, wypróbuj poniższe kody, aby uniknąć trudnych danych wejściowych (takich jak „1 2” lub ab ^> cd)
źródło
Testuję z poniższym kodem i jest w porządku.
źródło
IF DEFINED var
przyczynyZwykle używam tego:
Jeśli% 1 jest pusty, IF porówna „.” do "." które oceni prawdę.
źródło
Stworzyłem ten mały skrypt wsadowy na podstawie odpowiedzi tutaj, ponieważ istnieje wiele poprawnych. Dodawaj do tego, jeśli korzystasz z tego samego formatu:
źródło
Pusty ciąg to para
double-quotes
/""
, możemy po prostu przetestować długość:następnie przetestuj 2 znaki na
double-quotes
:Oto skrypt wsadowy, z którym możesz grać. Myślę, że właściwie łapie pusty ciąg.
To tylko przykład, wystarczy dostosować 2 (lub 3?) Kroki powyżej zgodnie ze skryptem.
Wynik testu tortur:
źródło
""
pusty ciąg jest pustym ciągiem `` a wsadowo pusta zmienna jest niezdefiniowaną zmienną. Możesz zdefiniować, że dla twoich argumentów zewnętrzne cytaty zostaną usunięte, ale wtedy łańcuch będzie nadal pusty o długości 0""
są również używane do pustych ciągów, ale dość łatwo można%~1
je usunąć z cudzysłowów. nie ma potrzeby korzystania z tak złożonego rozwiązania"%~1"==""
błąd z argumentem podobnym do tego,"Long File Name".txt
który jest poprawnym argumentem. edycja : I zdecydowanie nie jest to skomplikowane, jak powiedziałeś. Tylko 2 kroki powyżej do testu, reszta to pełny przykład.Możesz użyć
źródło
Skrypt 1:
Dane wejściowe („Usuń Quotes.cmd” „To jest test”)
Dane wyjściowe (nie ma,% 1 NIE było puste, puste lub NULL):
Uruchom („Usuń Quotes.cmd”) bez żadnych parametrów z powyższym skryptem 1
Dane wyjściowe (% 1 jest pusty, pusty lub NULL):
Uwaga: Jeśli ustawisz zmienną wewnątrz
IF ( ) ELSE ( )
instrukcji, nie będzie ona dostępna dla DEFINICJI, dopóki nie wyjdzie z instrukcji „JEŻELI” (chyba że włączona jest opcja „Opóźnione rozszerzanie zmiennej”; po włączeniu użyj wykrzyknika „!” Zamiast symbol procentu „%”}.Na przykład:
Skrypt 2:
Dane wejściowe („Usuń Quotes.cmd” „To jest test”)
Wynik:
Uwaga: usunie także cudzysłowy z ciągu.
Na przykład (przy użyciu skryptu 1 lub 2): C: \ Users \ Test \ Documents \ Batch Files> „Usuń Quotes.cmd” „To jest„ test ”
Dane wyjściowe (skrypt 2):
Wykonaj („Usuń Quotes.cmd”) bez żadnych parametrów w Skrypcie 2:
Wynik:
źródło
Podsumowując:
Ten kod wyświetli „Pusty ciąg”, jeśli% 1 to „” lub „albo pusty”. Dodano go do zaakceptowanej odpowiedzi, która jest obecnie niepoprawna.
źródło
Miałem wiele problemów z wieloma odpowiedziami w sieci. Większość działa na większość rzeczy, ale zawsze jest narożna skrzynka, która psuje każdą z nich.
Może nie działa, jeśli ma cytaty, może się psuje, jeśli nie ma cudzysłowów, błąd składniowy, jeśli var ma spację, niektóre będą działać tylko na parametrach (w przeciwieństwie do zmiennych środowiskowych), inne techniki pozwalają na puste zestaw cytatów, które należy przekazać jako „zdefiniowane”, a niektóre trudniejsze nie pozwolą na
else
późniejsze połączenie.Oto rozwiązanie, z którego jestem zadowolony. Daj mi znać, jeśli znajdziesz skrzynkę narożną, która nie będzie działać.
Posiadanie tego podprogramu w skrypcie lub w jego własnym
.bat
, powinno działać.Więc jeśli chcesz napisać (pseudo):
Możesz pisać:
Działa we wszystkich moich testach:
Echo'd
n
,y
,n
,y
,y
Więcej przykładów:
if
?Call :ifSet %var% && Echo set
Call :ifSet %var% || Echo set
Call :ifSet %1 && Echo set
ifSet.bat
? Nie ma problemu:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
źródło
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
:, echostrue
ifalse
ifSet
samodzielnie, a następnie używającIf %errorlevel% EQU 0 (x) Else (y)
set
zmiennych (jak[%bob%]
, działa tylko dla argumentów takich jak[%2]
), ale teraz ponowne sprawdzenie działa. Wydaje mi się, że moim jedynym problemem[]
jest przepuszczanie pustych cytatów, podczas gdy to nie będzie (tak naprawdę zależy od twojego przypadku użycia)/B
Flaga przerywa całą partię z wyjściem z EXITING podprogram lubcall
„d partii. Chyba że pytasz, co robi całe polecenie ; zwraca kod błędu, aby powiadomić skrypt wywołujący o wyniku podprogramu (0
pozytywny,1
negatywny), który można zastosować za pomocą logiki logicznej w odpowiedzi lub%errorlevel%
w powyższych komentarzachZa pomocą ! zamiast „do sprawdzania pustych ciągów
źródło
Dostałem się w niecały miesiąc (mimo że zapytano go 8 lat temu) ... Mam nadzieję, że do tej pory wyszedł poza pliki wsadowe. ;-) Robiłem to cały czas. Nie jestem jednak pewien, jaki jest ostateczny cel. Jeśli jest leniwy jak ja, mój plik go.bat działa na takie rzeczy. (Patrz poniżej) Ale 1, polecenie w OP może być nieprawidłowe, jeśli bezpośrednio używasz danych wejściowych jako polecenia. to znaczy,
to niepoprawne polecenie (lub używane, gdy byłeś na innym dysku). Musisz go rozbić na dwie części.
I, 2, co oznacza „zdefiniowany” lub „niezdefiniowany”? GIGO. Używam domyślnego, aby wyłapać błędy. Jeśli dane wejściowe nie zostaną złapane, spada do pomocy (lub domyślnego polecenia). Zatem żadne dane wejściowe nie są błędem. Możesz spróbować cd do wejścia i wychwycić błąd, jeśli taki istnieje. (Ok, przy użyciu pobierania go (tylko jeden paren) jest przechwytywany przez DOS. (Surowe!))
I, 3, cytaty są potrzebne tylko wokół ścieżki, a nie polecenia. to znaczy,
było złe (lub dawniej przywykło), chyba że byłeś na innym dysku.
jest funkcjonalny.
działa, jeśli masz spacje na swojej ścieżce.
źródło
cd
„s/d
przełącznika:cd /d "C:\Users\Me" (and the proper path delimeter for Windows is
` nie/
).