Was ist der richtige Weg, um zu testen, ob ein Parameter in einer Batchdatei leer ist?

211

Ich muss testen, ob eine Variable gesetzt ist oder nicht. Ich habe verschiedene Techniken ausprobiert, aber sie scheinen immer dann zu scheitern%1 sie von Anführungszeichen umgeben sind, wie zum Beispiel wenn dies der Fall %1ist "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.

Laut dieser Site sind dies die unterstützten IFSyntaxtypen. Ich sehe also keinen Weg, dies zu tun.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
blak3r
quelle
1
Auf meinen Systemen (Windows 2003 sowie Windows 7) wird if "%1" == "" GOTO MyLabeldie Ausführung des Skripts nicht tödlich beendet, solange %1eine gerade Anzahl von doppelten Anführungszeichen vorhanden ist. Ich sehe, dass eine ungerade Anzahl von doppelten Anführungszeichen %1die Ausführung des Skripts mit diesem Fehler beendet: The syntax of the command is incorrect.Die folgende Lösung, die eckige Klammern verwendet, um das Problem zu lösen, wurde als die richtige Antwort markiert, scheint aber nicht besser zu funktionieren . Diese Lösung schlägt auch mit demselben Fehler fehl, wenn %1eine ungerade Anzahl von doppelten Anführungszeichen vorliegt .
Susam Pal
@ SusamPal Interessant. Probieren Sie die Klammerversion darunter aus und prüfen Sie, ob dies funktioniert. Das habe ich mehr getestet. Ich habe gerade die akzeptierte Antwort vor ein paar Tagen aktualisiert.
Blak3r
Die Antwort von Dan Story scheint in der Tat gut zu funktionieren. Ich habe die Version in eckigen Klammern verwendet.
Susam Pal
Ein gutes Beispiel für "catch all": stackoverflow.com/questions/830565/…, das sowohl Datei- / Verzeichnis- als auch generische Zeichenfolgen- / Zahlenmischungen im Argument abdeckt.
So frustrierend - IF DEFINEDnur an Umgebungsvariablen statt an Skriptvariablen zu arbeiten, ist eine solche Verschwendung von Potenzial!
KayleeFrye_onDeck

Antworten:

289

Verwenden Sie eckige Klammern anstelle von Anführungszeichen:

IF [%1] == [] GOTO MyLabel

Klammern sind unsicher : Verwenden Sie nur eckige Klammern.

Dan Story
quelle
11
Klammern sind nicht sicher! Inhalt wie &in %1wird die Linie brechen
jeb
14
Die Verwendung anderer Zeichen wie if #%1#==##oder if [%1]==[]ist gut, solange das Argument keine Leerzeichen enthält. Andernfalls wird eine …was unexpected at this timeFehlermeldung angezeigt.
Synetech
12
Und verwenden "%~1"ist wirklich ein besserer Ansatz, wie ich in meiner Antwort erwähnt habe.
Jamesdlin
8
Leute, @jamesdlin ist richtig. Dieser Ansatz funktioniert nicht, wenn der variable Text Leerzeichen enthält oder ist ==. Verwenden Sie stattdessen seine Antwort.
James Ko
4
Sie machen das nicht klar it DOES NOT work with spaces. Verwenden Sie stattdessen die Antwort @jamesdlin.
JB. Mit Monica.
152

Sie können verwenden:

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

um den äußeren Satz von Anführungszeichen zu entfernen. Im Allgemeinen ist dies eine zuverlässigere Methode als die Verwendung von eckigen Klammern, da sie auch dann funktioniert, wenn die Variable Leerzeichen enthält.

Jamesdlin
quelle
9
Dies ist in der Tat ein guter Weg, dies zu tun. Mit verwenden ~Sie die äußeren Anführungszeichen, wenn sie vorhanden sind, und fügen sie dann manuell wieder hinzu (wobei nur ein Satz sichergestellt wird). Außerdem Sie haben zu Anführungszeichen verwenden , wenn das Argument Leerzeichen enthält (habe ich gelernt , diese auf die harte Tour , als meine vorherige Version der Verwendung #oder Klammern statt Anführungszeichen Argumente mit Leerzeichen verursacht eine werfen…was unexpected at this time Fehler.)
Synetech
4
Gilt dies auch für allgemeine Variablen wie% MYVAR% und nicht für Argumente wie% 1?
Simpleuser
4
@simpleuser Ups, Sie haben Recht, es funktioniert nicht mit allgemeinen Umgebungsvariablen.
Jamesdlin
1
Achten Sie auf Zeichenfolgen, die double '"' als Escape-Sequenz verwenden. Das Skript stürzt beim Versuch des Vergleichs ab. Beispiel ""this string will crash the comparison"": Double '"' ist die richtige Escape-Sequenz, und eine Ersetzung von double '"' schlägt fehl, wenn die Zeichenfolge ist leer.
Tydaeus
1
@Amalgovinus Sie könnten die Variable wahrscheinlich als Argument an eine Unterroutine übergeben und die Unterroutine verwenden lassen "%~1".
Jamesdlin
38

Eine der besten %1Halblösungen besteht darin, in eine Variable zu kopieren und dann die verzögerte Erweiterung als delayExp zu verwenden. ist immer sicher gegen Inhalte.

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

Dies hat den Vorteil, dass der Umgang mit param1 absolut sicher ist.

Und die Einstellung von param1 funktioniert in vielen Fällen wie

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

Aber es scheitert immer noch mit seltsamen Inhalten wie

test.bat ^&"&

Um eine 100% korrekte Antwort auf die Existenz zu bekommen

Es erkennt, ob %1es leer ist, aber für einige Inhalte kann es den Inhalt nicht abrufen.
Dies kann auch nützlich sein, um zwischen einem leeren %1und einem mit zu unterscheiden "".
Es nutzt die Fähigkeit des CALLBefehls, fehlzuschlagen, ohne die Batchdatei abzubrechen.

@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!'

Wenn Sie 100% kugelsicher sein möchten, um den Inhalt abzurufen, können Sie lesen, wie Sie selbst die seltsamsten Befehlszeilenparameter erhalten.

jeb
quelle
18

Von IF /?:

Wenn Befehlserweiterungen aktiviert sind, ändert sich IF wie folgt:

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

......

Die Bedingung DEFINED funktioniert genau wie EXISTS, außer dass sie einen Umgebungsvariablennamen verwendet und true zurückgibt, wenn die Umgebungsvariable definiert ist.

Andy Morris
quelle
1
Ja, ich habe diesen Ansatz tatsächlich ausprobiert und soweit ich das beurteilen kann, funktioniert dies nur mit ENVIRONMENT-Variablen. Funktionierte daher nicht mit% 1 oder einer in der Batchdatei definierten Variablen.
Blak3r
2
Das gilt nur für %1und dergleichen. "In der Batchdatei definierte Variablen" sind Umgebungsvariablen, während die Batchdatei ausgeführt wird, und Sie können IF DEFINEDsie verwenden.
zb226
8

Leider habe ich nicht genug Ruf, um die aktuellen Antworten zu kommentieren oder abzustimmen, auf die ich meine eigenen schreiben musste.

Ursprünglich lautete die Frage des OP "Variable" statt "Parameter", was sehr verwirrend wurde, zumal dies der Link Nummer eins in Google für die Suche nach Tests für leere Variablen war. Seit meiner ursprünglichen Antwort hat Stephan die ursprüngliche Frage bearbeitet, um die richtige Terminologie zu verwenden. Anstatt meine Antwort zu löschen, habe ich mich entschlossen, sie zu belassen, um Verwirrung zu beseitigen, insbesondere für den Fall, dass Google immer noch Leute nach Variablen schickt:

% 1 ist nicht variabel! ES IST EIN BEFEHLSLINIENPARAMETER.

Sehr wichtige Unterscheidung. Ein einzelnes Prozentzeichen mit einer Zahl nach einem Befehlszeilenparameter, der keine Variable ist.

Variablen werden mit dem Befehl set festgelegt und mit 2-Prozent-Zeichen abgerufen - eines vor und eines nach. Zum Beispiel% myvar%

Um auf eine leere Variable zu testen, verwenden Sie die Syntax "wenn nicht definiert" (Befehle explizit für Variablen erfordern keine Prozentzeichen), zum Beispiel:

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.

(Wenn Sie Befehlszeilenparameter testen möchten, empfehle ich, auf die Antwort von jamesdlin zu verweisen.)

AutoMattTick
quelle
1
Du hast recht. Aber der richtige Weg wäre gewesen, nur den Titel von if variable is emptybis zu korrigieren if parameter is empty. Ich habe es einfach gemacht. (auf die Gefahr hin, einige der Antworten ungültig zu machen, die Variablen anstelle von Parametern überprüft haben und daher ohnehin ungültig sind, da sie die Frage nicht beantwortet haben)
Stephan
1
OK, danke Stephan, wusste nicht, dass du das kannst. Ich habe meine Antwort bearbeitet, um das Update wiederzugeben.
AutoMattTick
6

Verwenden Sie den Befehl "IF DEFINED variable", um die Variable in der Batchdatei zu testen.

Wenn Sie jedoch Stapelparameter testen möchten, versuchen Sie die folgenden Codes, um schwierige Eingaben zu vermeiden (z. B. "1 2" oder ab ^> cd).

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)
zackz
quelle
5

Ich teste mit dem folgenden Code und es ist in Ordnung.

@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
quelle
Ihre Lösung schlägt fehl, wenn die Variable ein Anführungszeichen enthält. Übrigens gibt es die Syntax IF DEFINED varaus einem Grund
jeb
4

Ich benutze normalerweise Folgendes:

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

Wenn% 1 leer ist, vergleicht die IF "." zu "." was als wahr ausgewertet wird.

Aphorie
quelle
4
Das ist falsch. Dies ist dasselbe wie: WENN "% 1" == "" der Grund für diesen Beitrag war, wenn% 1 selbst Anführungszeichen hat, schlägt dies fehl.
Blak3r
Versuchen Sie zu testen, ob% 1 leer ist oder Anführungszeichen enthält? Die Frage ist unklar. Meine Antwort funktioniert, wenn in der Befehlszeile für% 1 nichts angegeben ist.
Aphorie
> Versuchen Sie zu testen, ob% 1 leer ist oder Anführungszeichen enthält? @aphoria, es muss in der Lage sein, mit beiden umzugehen.
Synetech
Ich habe dies verwendet, um herauszufinden, ob% 1% festgelegt wurde, was für mich gut funktioniert hat. Danke, gute Antwort!
Charlie A
4

Ich habe dieses kleine Batch-Skript basierend auf den Antworten hier erstellt, da es viele gültige gibt. Fühlen Sie sich frei, dies zu ergänzen, solange Sie dem gleichen Format folgen:

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
quelle
4

Leere Zeichenfolge ist ein Paar von double-quotes/ "", wir können nur die Länge testen:

set ARG=%1
if not defined ARG goto nomore

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

Testen Sie dann die 2 Zeichen gegen double-quotes:

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

Hier ist ein Batch-Skript, mit dem Sie spielen können. Ich denke, es fängt die leere Zeichenfolge richtig auf.

Dies ist nur ein Beispiel. Sie müssen lediglich 2 (oder 3?) Schritte oben entsprechend Ihrem Skript anpassen.

@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

Dieses Folter-Testergebnis:

.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" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
user6801759
quelle
Es ist falsch, eine leere Zeichenfolge ist keine Zeichenfolge mit zwei doppelten Anführungszeichen. ""Eine leere Zeichenfolge ist eine leere Zeichenfolge. Im Stapel ist eine leere Variable eine undefinierte Variable. Sie können definieren, dass für Ihre Argumente die äußeren Anführungszeichen entfernt werden, aber dann ist die Zeichenfolge mit einer Länge von 0 noch leer
jeb
In diesem Zusammenhang (win cmd-Argumente) können Sie eine leere Zeichenfolge nicht auf andere Weise bezeichnen, auch nicht mit einem doppelten einfachen Anführungszeichen, das unter der Unix-Shell ebenfalls leer ist.
user6801759
Ja, ""werden auch für leere Zeichenfolgen verwendet, aber es ist recht einfach %~1, die äußeren Anführungszeichen zu entfernen. Es ist nicht nötig, eine so komplexe Lösung zu verwenden
jeb
Sie haben Recht, ich könnte falsch sagen, es ist nicht nur für leere Zeichenfolgen, sondern eine sichere Möglichkeit, Argumente aufzuzählen. Andere Möglichkeiten, wie z. B. ein "%~1"==""Argument, "Long File Name".txtdas ein gültiges Argument ist, schlagen fehl . edit : Und es ist definitiv nicht komplex wie du gesagt hast. Nur 2 Schritte oben für den Test, der Rest ist ein ausführliches Beispiel.
user6801759
"wenn nicht definiert ARG" scheint perfekt zu funktionieren (meine Variable kommt nicht von der Kommandozeile)
GrayFace
3

Skript 1:

Eingabe ("Remove Quotes.cmd" "Dies ist ein 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

Ausgabe (Es gibt keine,% 1 war NICHT leer, leer oder NULL):


Führen Sie ("Remove Quotes.cmd") ohne Parameter mit dem obigen Skript 1 aus

Ausgabe (% 1 ist leer, leer oder NULL):

Welcome!

Press any key to continue . . .

Hinweis: Wenn Sie eine Variable in einer IF ( ) ELSE ( )Anweisung festlegen, steht sie DEFINED erst nach dem Beenden der "IF" -Anweisung zur Verfügung (es sei denn, "Delayed Variable Expansion" ist aktiviert; verwenden Sie nach der Aktivierung ein Ausrufezeichen "!" Anstelle von Prozent "%" Symbol}.

Beispielsweise:

Skript 2:

Eingabe ("Remove Quotes.cmd" "Dies ist ein 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

Ausgabe:

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>  

Hinweis: Außerdem werden Anführungszeichen aus der Zeichenfolge entfernt.

Zum Beispiel (mit Skript 1 oder 2): C: \ Benutzer \ Test \ Dokumente \ Batchdateien> "Quotes.cmd entfernen" "Dies ist" ein "Test"

Ausgabe (Skript 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  

Führen Sie ("Remove Quotes.cmd") ohne Parameter in Skript 2 aus:

Ausgabe:

Welcome!

Press any key to continue . . .
Mr. Rick
quelle
3

Um es zusammenzufassen:

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

Dieser Code gibt "Leere Zeichenfolge" aus, wenn% 1 entweder "" oder "oder leer ist. Er wurde der akzeptierten Antwort hinzugefügt, die derzeit falsch ist.

GrayFace
quelle
0

Ich hatte viele Probleme mit vielen Antworten im Internet. Die meisten arbeiten für die meisten Dinge, aber es gibt immer einen Eckfall, der jeden kaputt macht.
Vielleicht funktioniert es nicht, wenn es Anführungszeichen hat, vielleicht bricht es, wenn es keine Anführungszeichen hat, Syntaxfehler, wenn die Variable ein Leerzeichen hat, einige funktionieren nur mit Parametern (im Gegensatz zu Umgebungsvariablen), andere Techniken erlauben ein Leerzeichen Eine Reihe von Anführungszeichen, die als "definiert" übergeben werden sollen, und einige schwierigere lassen Sie nicht elsehinterher verketten .

Hier ist eine Lösung, mit der ich zufrieden bin. Bitte lassen Sie mich wissen, wenn Sie einen Eckkoffer finden, für den es nicht funktioniert.

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

Diese Unterroutine sollte entweder in Ihrem Skript oder in einem eigenen Skript vorhanden .batsein.
Also, wenn Sie schreiben wollten (in Pseudo):

if (var)
then something
else somethingElse

Du kannst schreiben:

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

Es hat bei allen meinen Tests funktioniert:

(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


Mehr Beispiele:

  • Willst du nur nachsehen if?Call :ifSet %var% && Echo set
  • Nur wenn nicht (nur das andere)? Call :ifSet %var% || Echo set
  • Überprüfen eines übergebenen Arguments; funktioniert gut.Call :ifSet %1 && Echo set
  • Wollten Sie Ihren Skript- / Dupe-Code nicht verstopfen, also haben Sie ihn in seinen eigenen Code eingefügt ifSet.bat? Kein Problem:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
Hashbrown
quelle
Einen Fall gefunden; Wenn Sie die if with else-Syntax ausprobieren und der letzte Befehl im then-Block fehlschlägt, wird else ausgeführt : (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo, echos true und false
Hashbrown
Wenn dies ein Problem ist und Sie sich mit einer zusätzlichen Leitung befassen können, können Sie dies abmildern, indem Sie selbst anrufen ifSetund dannIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown
In welchen Fällen funktioniert die akzeptierte Antwort (in eckigen Klammern) nicht? Und können Sie erklären, was der Exit / B macht
blak3r
Aus irgendeinem Grund ist es beim Testen kaputt gegangen, wenn setVariablen verwendet wurden (z. B. [%bob%]nur für Argumente wie [%2]), aber jetzt funktioniert es erneut. Ich denke, mein einziger Kritikpunkt im Moment []ist, dass leere Anführungszeichen passieren, während dies nicht der Fall ist (es liegt also wirklich an Ihrem Anwendungsfall)
Hashbrown,
Das /BFlag verhindert, dass der gesamte Stapel beendet wird, und beendet nur das Unterprogramm oder callden Stapel. Es sei denn, Sie fragen, was der gesamte Befehl tut. Es wird ein Fehlercode zurückgegeben, um das aufrufende Skript über das Ergebnis der Unterroutine ( 0bestanden, 1nicht bestanden) zu informieren, die über die boolesche Logik in der Antwort oder über %errorlevel%die obigen Kommentare verwendet werden kann
Hashbrown
0

Verwenden! anstelle von "zur Überprüfung leerer Zeichenfolgen

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
Lin W.
quelle
1
Der Tipp ist wirklich schlecht. Anführungszeichen können mindestens Leerzeichen und Sonderzeichen verarbeiten, Ausrufezeichen jedoch nicht. Und Ausrufezeichen werden hier wirklich böse, wenn die verzögerte Erweiterung aktiviert ist
jeb
0

Ich bin in knapp einem Monat eingestiegen (obwohl es vor 8 Jahren gefragt wurde) ... Ich hoffe, er / sie ist inzwischen über Batch-Dateien hinausgegangen. ;-) Ich habe das die ganze Zeit gemacht. Ich bin mir jedoch nicht sicher, was das ultimative Ziel ist. Wenn er / sie faul ist wie ich, funktioniert mein go.bat für solche Sachen. (Siehe unten) 1 Der Befehl im OP kann jedoch ungültig sein, wenn Sie die Eingabe direkt als Befehl verwenden. dh

"C:/Users/Me"

ist ein ungültiger Befehl (oder früher, wenn Sie sich auf einem anderen Laufwerk befanden). Sie müssen es in zwei Teile teilen.

C:
cd /Users/Me

Und 2, was bedeutet "definiert" oder "undefiniert"? GIGO. Ich verwende die Standardeinstellung, um Fehler abzufangen. Wenn die Eingabe nicht abgefangen wird, wird sie zur Hilfe (oder als Standardbefehl) gelöscht. Keine Eingabe ist also kein Fehler. Sie können versuchen, eine CD an den Eingang zu senden und den Fehler abzufangen, falls vorhanden. (Ok, mit go "-Downloads (nur ein Paren) wird von DOS abgefangen. (Harsh!))

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

Und 3, Anführungszeichen werden nur um den Pfad herum benötigt, nicht um den Befehl. dh

"cd C:\Users" 

war schlecht (oder früher gewohnt), es sei denn, Sie waren auf einer anderen Fahrt.

cd "\Users" 

ist funktionsfähig.

cd "\Users\Dr Whos infinite storage space"

funktioniert, wenn Sie Leerzeichen in Ihrem Pfad haben.

@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
quelle
Es gibt einen Grund für cdden /dWechsel: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is `, nicht /).
Stephan