Próbuję użyć następującej logiki sprawdzania poprawności w pliku wsadowym, ale blok „użycie” nigdy nie jest wykonywany, nawet jeśli do pliku wsadowego nie podano żadnego parametru.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Co ja robię źle?
batch-file
arguments
Daniel Fortunov
źródło
źródło
Odpowiedzi:
Sprawdzanie, czy argument wiersza poleceń został ustawiony, może być
[%1]==[]
, ale, jak wskazuje Dave Costa , również zadziała."%1"==""
Naprawiłem również błąd składni w echu użycia, aby uniknąć znaków większości i mniejszych. Ponadto
exit
potrzebuje/B
argumentu, w przeciwnym razieCMD.exe
zakończy się.źródło
set
zmiennych (nie znam poprawnej terminologii wsadowej), możesz zechcieć użyć,"%myvar%"==""
ponieważ jeślimyvar
zawiera spacje i nie jest cytowany, otrzymasz komunikat „nieoczekiwany w tym czasie ”wiadomość.IF NOT DEFINED VarName
bloku. Również +1 dla tukushan za niestosowanie cytatów w porównaniu. Po prostu tego nie rób. Nigdy."%~1"==""
zadziała również i zajmie się przypadkiem, w którym% 1 ma podwójne cudzysłowy"%~1"==""
obsługuje spacje w zmiennej, podczas gdy[]
wersja nie.✨ inne rzeczy…
■ w
%~1
-~
usuwa wszelkie opakowania"
lub'
.■ in
%~s1
-s
tworzy ścieżkęDOS 8.3 naming
, co jest fajną sztuczką pozwalającą uniknąć spacji w nazwie pliku podczas sprawdzania rzeczy (w ten sposób nie ma potrzeby zawijania zasobu większą liczbą"
s.■
["%~1"]==[""]
„nie można być pewnym”, jeśli argument jest plikiem / katalogiem lub tylko ogólnym ciągiem znaków, więc zamiast tego wyrażenie używa nawiasów i oryginalnego niezmodyfikowanego%1
(tylko bez"
zawijania, jeśli istnieje ..)jeśli nie było argumentów lub jeśli użyliśmy,
shift
a wskaźnik listy argumentów przekroczył ostatni, wyrażenie zostanie obliczone na[""]==[""]
.■ jest to tak szczegółowe, jak możesz być bez używania większej liczby sztuczek (działałoby nawet w skryptach wsadowych systemu Windows-95 ...)
■ przykłady wykonania
zapisz to jako
identifier.cmd
może zidentyfikować nieograniczoną liczbę argumentów (zwykle jesteś ograniczony do
%1
-%9
), po prostu pamiętaj, aby zawijać argumenty cudzysłowami lub użyć nazewnictwa 8.3, lub przeciągnij i upuść je (automatycznie robi jedno z powyższych).pozwala to na uruchamianie następujących poleceń:
⓵
identifier.cmd c:\windows
i dostać⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
i dostać⓷ i wiele argumentów (oczywiście to cała sprawa ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
i dostać
naturalnie może być dużo bardziej złożone, ale ładne przykłady zawsze powinny być proste i minimalne. :)
Mam nadzieję, że to pomoże każdemu :)
opublikowane tutaj: CMD Ninja - nieograniczone przetwarzanie argumentów, identyfikacja, czy istnieją w systemie plików, identyfikacja, czy plik lub katalog
a oto działający przykład, który pobiera dowolną ilość plików APK (aplikacji na Androida) i instaluje je na urządzeniu za pomocą konsoli debugowania (ADB.exe): Utwórz poprzedni post Masowy instalator APK, który nie używa składni ADB Install-Multi
źródło
Pozbądź się nawiasów.
Przykładowy plik wsadowy:
Wynik uruchomienia powyższego skryptu:
Myślę, że tak naprawdę to nawiasy są częścią ciągów i są one porównywane.
źródło
if "%1"==""
ulegnie awarii, jeśli argument ma spacje. Na przykład:run.bat "a b"
. @amr ma najlepszą odpowiedź do użyciaif "%~1"==""
~ anuluje cudzysłów% 1, jeśli sam% 1 jest cytowany.
„” będzie chronił przed przekazanymi znakami specjalnymi. na przykład wywołanie skryptu za pomocą & ping
źródło
run.bat "a b"
run.bat ""
nie zostanie złapany przez[%1]==[]
.źródło
run.bat "a b"
To jest to samo, co inne odpowiedzi, ale używa tylko jednej etykiety i stawia użycie na pierwszym miejscu, co dodatkowo sprawia, że służy jako rodzaj dokumentacji pochwalającej skrypt, który również jest zwykle umieszczony na górze:
Jeśli jednak nie musisz używać cmd / batch, używać bash na WSL lub PowerShell, mają one bardziej rozsądną składnię i mniej tajemniczych funkcji.
źródło
JEŻELI "% 1" == "" się nie powiedzie, wszystkie wersje tego błędu będą się nie powieść w pewnych warunkach trujących znaków. Tylko JEŚLI ZDEFINIOWANE lub NIE ZDEFINIOWANE są bezpieczne
źródło
if [not] defined ...
nie działa z parametrami takimi jak%1
. Masz przykład, gdzieif "%~1" ...
nie działa?