Jaki jest właściwy sposób sprawdzenia, czy parametr jest pusty w pliku wsadowym?

213

Muszę sprawdzić, czy zmienna jest ustawiona, czy nie. Wypróbowałem kilka technik, ale wydaje się, że zawodzą, gdy %1są otoczone cytatami, na przykład w przypadku, gdy %1jest "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 IFtypy 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
blak3r
źródło
1
W moich systemach (Windows 2003 i Windows 7) if "%1" == "" GOTO MyLabelnie zabija śmiertelnie wykonywania skryptu, o ile %1ma parzystą liczbę podwójnych cudzysłowów. Widzę, że nieparzysta liczba podwójnych cudzysłowów %1zabija 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 %1zawiera nieparzystą liczbę podwójnych cudzysłowów.
Susam Pal
@SusamPal Ciekawe. Wypróbuj podaną w nawiasie wersję i sprawdź, czy to działa. Ten testowałem więcej. Właśnie zaktualizowałem zaakceptowaną odpowiedź kilka dni temu.
blak3r
Odpowiedź Dana Story wydaje się naprawdę dobrze działać. Użyłem wersji przy użyciu nawiasów kwadratowych.
Susam Pal
dobry przykład „catch all”: stackoverflow.com/questions/830565/... obejmujący zarówno argument plik / katalog i ogólny ciąg znaków / liczb w argumencie.
Tak frustrujące - IF DEFINEDpraca nad zmiennymi środowiskowymi zamiast zmiennymi skryptowymi jest marnowaniem potencjału!
kayleeFrye_onDeck

Odpowiedzi:

290

Użyj nawiasów kwadratowych zamiast cudzysłowów:

IF [%1] == [] GOTO MyLabel

Nawiasy są niepewne : używaj tylko nawiasów kwadratowych.

Dan Story
źródło
11
nawiasy nie są bezpieczne! Treść taka jak &w %1przekroczy linię
jeb
14
Używanie innych znaków takich jak if #%1#==##lub if [%1]==[]jest dobre, o ile w argumencie nie ma spacji, w przeciwnym razie wystąpi …was unexpected at this timebłąd.
Synetech,
12
A używanie "%~1"jest naprawdę lepszym podejściem, jak wspomniałem w mojej odpowiedzi.
jamesdlin
8
Chłopaki, @jamesdlin jest poprawny. To podejście nie zadziała, jeśli tekst zmiennej zawiera spacje lub jest ==. Zamiast tego użyj jego odpowiedzi.
James Ko
4
Nie wyjaśniacie tego jasno it DOES NOT work with spaces. Zamiast tego użyj odpowiedzi @jamesdlin.
JB. Z Moniką.
153

Możesz użyć:

IF "%~1" == "" GOTO MyLabel

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.

jamesdlin
źródło
9
To naprawdę dobry sposób, aby to zrobić. Używając ~, 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 timebłąd.)
Synetech
4
czy dotyczy to również zmiennych ogólnych, takich jak% MYVAR%, a nie argumentów, takich jak% 1?
simpleuser
4
@simpleuser Ups, masz rację, to nie działa z ogólnymi zmiennymi środowiskowymi.
jamesdlin
1
uważaj na ciągi, które używają podwójnego „” jako sekwencji ucieczki - skrypt zawiesza się podczas próby porównania. Np ""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
Tydaeus
1
@Amalgovinus Prawdopodobnie mógłbyś przekazać zmienną jako argument do podprogramu i pozwolić, aby podprogram wykorzystał "%~1".
jamesdlin
38

Jednym z najlepszych rozwiązań semi jest skopiowanie %1do zmiennej, a następnie użycie opóźnionego rozwinięcia, jako delayedExp. jest zawsze bezpieczny w przypadku jakichkolwiek treści.

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

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

test.bat hello"this is"a"test
test.bat you^&me

Ale nadal zawodzi z dziwnymi treściami takimi jak

test.bat ^&"&

Aby uzyskać 100% poprawną odpowiedź na istnienie

Wykrywa, czy %1jest 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 %1i jednego z "".
Wykorzystuje zdolność CALLpolecenia do niepowodzenia bez przerywania pliku wsadowego.

@echo off
setlocal EnableDelayedExpansion
set "arg1="
call set "arg1=%%1"

if defined arg1 goto :arg_exists

set "arg1=#"
call set "arg1=%%1"
if "!arg1!" EQU "#" (
    echo arg1 exists, but can't assigned to a variable
    REM Try to fetch it a second time without quotes
    (call set arg1=%%1)
    goto :arg_exists
)

echo arg1 is missing
exit /b

:arg_exists
echo arg1 exists, perhaps the content is '!arg1!'

Jeśli chcesz być w 100% odporny na pociski, aby pobrać zawartość, przeczytaj artykuł Jak otrzymać nawet najdziwniejsze parametry wiersza poleceń?

jeb
źródło
18

Z IF / ?:

Jeśli rozszerzenia poleceń są włączone, JEŻELI zmieni się w następujący sposób:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

Warunek DEFINED działa podobnie jak EXISTS, z tym że przyjmuje nazwę zmiennej środowiskowej i zwraca true, jeśli zmienna środowiskowa jest zdefiniowana.

Andy Morris
źródło
1
Tak, faktycznie wypróbowałem to podejście i z tego, co mogłem powiedzieć, działa ono tylko ze zmiennymi ŚRODOWISKA. Dlatego nie działał z% 1 lub zmienną zdefiniowaną w pliku wsadowym.
blak3r
2
Dotyczy to tylko %1polubień. „Zmienne zdefiniowane w pliku wsadowym” są w rzeczywistości zmiennymi środowiskowymi, gdy plik wsadowy jest uruchomiony i można IF DEFINEDz nich korzystać.
zb226
8

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:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(Jeśli chcesz przetestować parametry wiersza poleceń, polecam odnieść się do odpowiedzi jamesdlin.)

AutoMattTick
źródło
1
masz rację. Ale poprawnym sposobem byłoby po prostu poprawienie tytułu od if variable is emptydo if 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)
Stephan
1
OK dzięki Stephan, nie zdawałem sobie sprawy, że możesz to zrobić. Zredagowałem swoją odpowiedź, aby odzwierciedlić aktualizację.
AutoMattTick
6

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)

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)
zackz
źródło
5

Testuję z poniższym kodem i jest w porządku.

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)
Kate
źródło
Twoje rozwiązanie zawiedzie, gdy zmienna zawiera cytat. Btw istnieje nie bez IF DEFINED varprzyczyny
jeb
4

Zwykle używam tego:

IF "%1."=="." GOTO MyLabel

Jeśli% 1 jest pusty, IF porówna „.” do "." które oceni prawdę.

aforia
źródło
4
To jest niepoprawne. Jest to to samo, co: JEŻELI "% 1" == "" powodem tego postu było, jeśli sam% 1 ma cytaty, to się nie powiedzie.
blak3r
Czy próbujesz sprawdzić, czy% 1 jest pusty, czy zawiera cudzysłowy? Pytanie jest niejasne. Moja odpowiedź działa, jeśli nie podano nic w wierszu polecenia dla% 1.
aforia
> Czy próbujesz sprawdzić, czy% 1 jest pusty, czy zawiera cudzysłowy? @aphoria, musi być w stanie obsłużyć oba.
Synetech
Użyłem tego do sprawdzenia, czy% 1% zostało ustawione, działało dla mnie ładnie. Dzięki, dobra odpowiedź!
Charlie A
4

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:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause
kayleeFrye_onDeck
źródło
4

Pusty ciąg to para double-quotes/ "", możemy po prostu przetestować długość:

set ARG=%1
if not defined ARG goto nomore

set CHAR=%ARG:~2,1%
if defined CHAR goto goon

następnie przetestuj 2 znaki na double-quotes:

if ^%ARG:~1,1% == ^" if ^%ARG:~0,1% == ^" goto blank
::else
goto goon

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.

@echo off
if not "%OS%"=="Windows_NT" goto EOF
:: I guess we need enableExtensions, CMIIW
setLocal enableExtensions
set i=0
set script=%0

:LOOP
set /a i=%i%+1

set A1=%1
if not defined A1 goto nomore

:: Assumption:
:: Empty string is (exactly) a pair of double-quotes ("")

:: Step out if str length is more than 2
set C3=%A1:~2,1%
if defined C3 goto goon

:: Check the first and second char for double-quotes
:: Any characters will do fine since we test it *literally*
if ^%A1:~1,1% == ^" if ^%A1:~0,1% == ^" goto blank
goto goon

:goon
echo.args[%i%]: [%1]
shift
goto LOOP

:blank
echo.args[%i%]: [%1] is empty string
shift
goto LOOP

:nomore
echo.
echo.command line:
echo.%script% %*

:EOF

Wynik testu tortur:

.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
args[1]: [::]
args[2]: [""] is empty string
args[3]: [">"""bl" "]
args[4]: ["< "">"]
args[5]: [(")(")]
args[6]: [""] is empty string
args[7]: [::]
args[8]: [""-"  "]
args[9]: ["( )"">\>"]
args[10]: [""] is empty string

command line:
.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
użytkownik6801759
źródło
To źle, pusty ciąg nie jest ciągiem z dwoma podwójnymi cudzysłowami ""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
jeb
W tym kontekście (argumenty win cmd) nie można oznaczać pustego łańcucha w żaden inny sposób, nawet z podwójnym pojedynczym cudzysłowiem, który jest równie pusty w powłoce unix.
user6801759,
Tak, ""są również używane do pustych ciągów, ale dość łatwo można %~1je usunąć z cudzysłowów. nie ma potrzeby korzystania z tak złożonego rozwiązania
jeb
Masz rację, mógłbym niewłaściwie stwierdzić, że to nie tylko pusty ciąg, ale bezpieczny sposób na wyliczenie argumentów. Inne sposoby, takie jak "%~1"==""błąd z argumentem podobnym do tego, "Long File Name".txtktó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.
user6801759,
„jeśli nie zdefiniowano ARG” wydaje się działać idealnie (moja zmienna nie pochodzi z wiersza poleceń)
GrayFace
3

Skrypt 1:

Dane wejściowe („Usuń Quotes.cmd” „To jest test”)

@ECHO OFF

REM Set "string" variable to "first" command line parameter
SET STRING=%1

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

REM IF %1 [or String] is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel


REM   OR   IF "." equals "." GOTO MyLabel
IF "%STRING%." == "." GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

PAUSE

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):

Welcome!

Press any key to continue . . .

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”)

@ECHO OFF

SETLOCAL EnableDelayedExpansion

SET STRING=%0
IF 1==1 (
  SET STRING=%1
  ECHO String in IF Statement='%STRING%'
  ECHO String in IF Statement [delayed expansion]='!STRING!'
) 

ECHO String out of IF Statement='%STRING%'

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

ECHO String without Quotes=%STRING% 

REM IF %1 is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

ENDLOCAL
PAUSE

Wynik:

C:\Users\Test>"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" "This is a Test"  
String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is a Test"'  
String out of IF Statement='"This is a Test"'  
String without Quotes=This is a Test  

C:\Users\Test>  

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):

String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is "a" Test"'  
String out of IF Statement='"This is "a" Test"'  
String without Quotes=This is a Test  

Wykonaj („Usuń Quotes.cmd”) bez żadnych parametrów w Skrypcie 2:

Wynik:

Welcome!

Press any key to continue . . .
Pan Rick
źródło
3

Podsumowując:

set str=%~1
if not defined str ( echo Empty string )

Ten kod wyświetli „Pusty ciąg”, jeśli% 1 to „” lub „albo pusty”. Dodano go do zaakceptowanej odpowiedzi, która jest obecnie niepoprawna.

GrayFace
źródło
0

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 elsepóź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ć.

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

Posiadanie tego podprogramu w skrypcie lub w jego własnym .bat, powinno działać.
Więc jeśli chcesz napisać (pseudo):

if (var)
then something
else somethingElse

Możesz pisać:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)

Działa we wszystkich moich testach:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

Echo'd n, y, n, y,y


Więcej przykładów:

  • Chcesz tylko sprawdzić if?Call :ifSet %var% && Echo set
  • Tylko jeśli nie (tylko inne)? Call :ifSet %var% || Echo set
  • Sprawdzanie przekazanego argumentu; działa w porządku.Call :ifSet %1 && Echo set
  • Nie chciałeś zatkać swoich skryptów / kodu dupe, więc umieściłeś go we własnym ifSet.bat? Nie ma problemu:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
Hashbrown
źródło
Znaleziono sprawę; Jeśli spróbujesz użyć składni if ​​z else, a ostatnie polecenie w tym bloku nie powiedzie się, else wykona (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo:, echos true i false
Hashbrown
W rzeczywistości, jeśli jest to problem i możesz poradzić sobie z dodatkową linią, możesz to złagodzić, dzwoniąc ifSetsamodzielnie, a następnie używającIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown
W jakich przypadkach nie działa zaakceptowana odpowiedź (użyj nawiasów kwadratowych)? Czy możesz wyjaśnić, co robi Exit / B
blak3r,
z jakiegoś powodu, kiedy go testowałem, zepsuł się podczas używania setzmiennych (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)
Hashbrown
/BFlaga przerywa całą partię z wyjściem z EXITING podprogram lub call„d partii. Chyba że pytasz, co robi całe polecenie ; zwraca kod błędu, aby powiadomić skrypt wywołujący o wyniku podprogramu ( 0pozytywny, 1negatywny), który można zastosować za pomocą logiki logicznej w odpowiedzi lub %errorlevel%w powyższych komentarzach
Hashbrown
0

Za pomocą ! zamiast „do sprawdzania pustych ciągów

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
Lin W.
źródło
1
Wskazówka jest naprawdę zła. Cytaty mogą obsługiwać co najmniej spacje i znaki specjalne, ale wykrzykniki nie. I wykrzykniki stają się naprawdę nieprzyjemne, gdy włączone jest opóźnione rozszerzanie
jeb
0

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,

"C:/Users/Me"

to niepoprawne polecenie (lub używane, gdy byłeś na innym dysku). Musisz go rozbić na dwie części.

C:
cd /Users/Me

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!))

cd "%1"
if %errorlevel% neq 0 goto :error

I, 3, cytaty są potrzebne tylko wokół ścieżki, a nie polecenia. to znaczy,

"cd C:\Users" 

było złe (lub dawniej przywykło), chyba że byłeś na innym dysku.

cd "\Users" 

jest funkcjonalny.

cd "\Users\Dr Whos infinite storage space"

działa, jeśli masz spacje na swojej ścieżce.

@REM go.bat
@REM The @ sigh prevents echo on the current command
@REM The echo on/off turns on/off the echo command. Turn on for debugging
@REM You can't see this.
@echo off
if "help" == "%1" goto :help

if "c" == "%1" C:
if "c" == "%1" goto :done

if "d" == "%1" D:
if "d" == "%1" goto :done

if "home"=="%1" %homedrive%
if "home"=="%1" cd %homepath%
if "home"=="%1" if %errorlevel% neq 0 goto :error
if "home"=="%1" goto :done

if "docs" == "%1" goto :docs

@REM goto :help
echo Default command
cd %1
if %errorlevel% neq 0 goto :error
goto :done

:help
echo "Type go and a code for a location/directory
echo For example
echo go D
echo will change disks (D:)
echo go home
echo will change directories to the users home directory (%homepath%)
echo go pictures
echo will change directories to %homepath%\pictures
echo Notes
echo @ sigh prevents echo on the current command
echo The echo on/off turns on/off the echo command. Turn on for debugging
echo Paths (only) with folder names with spaces need to be inclosed in         quotes (not the ommand)
goto :done

:docs
echo executing "%homedrive%%homepath%\Documents"
%homedrive%
cd "%homepath%\Documents"\test error\
if %errorlevel% neq 0 goto :error
goto :done

:error
echo Error: Input (%1 %2 %3 %4 %5 %6 %7 %8 %9) or command is invalid
echo go help for help
goto :done

:done
Xorange
źródło
nie ma powodu do cd„s /dprzełącznika: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is ` nie /).
Stephan