Quelle est la bonne façon de tester si un paramètre est vide dans un fichier batch?

214

J'ai besoin de tester si une variable est définie ou non. J'ai essayé plusieurs techniques , mais ils semblent échouer à chaque fois %1est entouré par des guillemets comme le cas où %1est "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.

Selon ce site , ce sont les IFtypes de syntaxe pris en charge . Donc, je ne vois pas de moyen de le faire.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
blak3r
la source
1
Sur mes systèmes (Windows 2003 ainsi que Windows 7), if "%1" == "" GOTO MyLabelne tue pas fatalement l'exécution du script tant qu'il %1a un nombre pair de guillemets doubles. Je vois qu'un nombre impair de guillemets doubles %1tue l'exécution du script avec cette erreur: The syntax of the command is incorrect.La solution ci-dessous qui utilise des crochets pour résoudre le problème a été marquée comme la bonne réponse mais elle ne semble pas faire mieux . Cette solution échoue également avec la même erreur lorsqu'il y %1a un nombre impair de guillemets doubles.
Susam Pal
@SusamPal Intéressant. Essayez la version entre parenthèses en dessous et voyez si cela fonctionne. Celui-là, j'ai testé plus. Je viens de mettre à jour la réponse acceptée il y a quelques jours.
blak3r
La réponse de Dan Story semble bien fonctionner. J'ai utilisé la version en utilisant des crochets.
Susam Pal
un bon exemple "catch all": stackoverflow.com/questions/830565/… couvrant à la fois le fichier / répertoire et le mélange générique chaîne / nombre en argument.
Tellement frustrant - IF DEFINEDtravailler uniquement sur des variables d'environnement au lieu de variables de script est un tel gaspillage de potentiel!
kayleeFrye_onDeck

Réponses:

292

Utilisez des crochets au lieu des guillemets:

IF [%1] == [] GOTO MyLabel

Les parenthèses ne sont pas sécurisées : utilisez uniquement des crochets.

Dan Story
la source
11
les parenthèses ne sont pas sécurisées! Un contenu comme &dans %1cassera la ligne
jeb
14
Utiliser d'autres caractères comme if #%1#==##ou if [%1]==[]est bon tant qu'il n'y a pas d'espace dans l'argument, sinon vous obtiendrez une …was unexpected at this timeerreur.
Synetech
12
Et l'utilisation "%~1"est vraiment une meilleure approche, comme je l'ai mentionné dans ma réponse.
jamesdlin
8
Les gars, @jamesdlin est correct. Cette approche ne fonctionnera pas si le texte variable a des espaces ou l'est ==. Utilisez plutôt sa réponse.
James Ko
4
Vous ne le dites pas clairement it DOES NOT work with spaces. Utilisez plutôt la réponse @jamesdlin.
JB. Avec Monica.
153

Vous pouvez utiliser:

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

pour supprimer l'ensemble extérieur de guillemets. En général, c'est une méthode plus fiable que l'utilisation de crochets car elle fonctionnera même si la variable contient des espaces.

jamesdlin
la source
9
C'est en effet une bonne façon de procéder. En utilisant ~, vous supprimez les guillemets externes s'ils sont présents, puis vous les rajoutez manuellement (en ne garantissant qu'un seul ensemble). De plus, vous devez utiliser des guillemets si l'argument contient des espaces (j'ai appris cela à la dure lorsque ma version précédente de l'utilisation de #crochets ou au lieu de guillemets provoquait une …was unexpected at this timeerreur avec les arguments avec des espaces .)
Synetech
4
est-ce également applicable aux variables générales comme% MYVAR% plutôt qu'aux arguments comme% 1?
simpleuser
4
@simpleuser Oups, vous avez raison, cela ne fonctionne pas avec les variables d'environnement générales.
jamesdlin
1
faites attention aux chaînes qui utilisent le double "" comme séquence d'échappement - le script se bloquera lors de la comparaison. Par exemple ""this string will crash the comparison"". Double "" est la séquence d'échappement appropriée, et faire une substitution sur le double "" échouera si le la chaîne est vide
Tydaeus
1
@Amalgovinus Vous pourriez probablement passer la variable comme argument à un sous-programme et laisser le sous-programme utiliser "%~1".
jamesdlin
38

L'une des meilleures solutions semi est de copier %1dans une variable, puis d'utiliser une expansion retardée, comme retardExp. est toujours à l'abri de tout contenu.

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

L'avantage de cela est que le traitement de param1 est absolument sûr.

Et le réglage de param1 fonctionnera dans de nombreux cas, comme

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

Mais il échoue toujours avec des contenus étranges comme

test.bat ^&"&

Pour pouvoir obtenir une réponse 100% correcte à l'existence

Il détecte si %1est vide, mais pour certains contenus, il ne peut pas récupérer le contenu.
Cela peut également être utile pour faire la distinction entre un vide %1et un avec "".
Il utilise la capacité de la CALLcommande à échouer sans abandonner le fichier de commandes.

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

Si vous voulez être à 100% à l'épreuve des balles pour récupérer le contenu, vous pouvez lire Comment recevoir même les paramètres de ligne de commande les plus étranges?

jeb
la source
18

De IF /?:

Si les extensions de commande sont activées, IF change comme suit:

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

......

Le conditionnel DEFINED fonctionne exactement comme EXISTS, sauf qu'il prend un nom de variable d'environnement et renvoie true si la variable d'environnement est définie.

Andy Morris
la source
1
Oui, j'ai réellement essayé cette approche et d'après ce que j'ai pu voir, cela ne fonctionne qu'avec les variables ENVIRONNEMENT. Par conséquent, n'a pas fonctionné avec% 1 ou une variable définie dans le fichier de commandes.
blak3r
2
Ce n'est vrai que pour %1et les autres. Les "variables définies à l'intérieur du fichier de commandes" sont en fait des variables d'environnement pendant l'exécution du fichier de commandes et vous pouvez les utiliser IF DEFINED.
zb226
8

Malheureusement, je n'ai pas assez de réputation pour commenter ou voter sur les réponses actuelles car j'ai dû écrire les miennes.

À l'origine, la question du PO parlait de "variable" plutôt que de "paramètre", ce qui est devenu très déroutant, d'autant plus qu'il s'agissait du lien numéro un dans Google pour rechercher comment tester les variables vides. Depuis ma réponse d'origine, Stephan a modifié la question d'origine pour utiliser la terminologie correcte, mais plutôt que de supprimer ma réponse, j'ai décidé de la laisser pour dissiper toute confusion, en particulier dans le cas où Google envoie encore des gens ici pour des variables:

% 1 N'EST PAS UN VARABLE! C'EST UN PARAMÈTRE DE LIGNE DE COMMANDE.

Distinction très importante. Un signe de pourcentage unique avec un nombre après qu'il se réfère à un paramètre de ligne de commande et non à une variable.

Les variables sont définies à l'aide de la commande set et sont rappelées à l'aide de signes à 2% - un avant et un après. Par exemple% myvar%

Pour tester une variable vide, vous utilisez la syntaxe "si non définie" (les commandes explicites pour les variables ne nécessitent aucun signe de pourcentage), par exemple:

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.

(Si vous souhaitez tester les paramètres de ligne de commande, je vous recommande de vous référer à la réponse de jamesdlin.)

AutoMattTick
la source
1
vous avez raison. Mais la bonne façon aurait été de simplement corriger le titre de if variable is emptyà if parameter is empty. Je viens de le faire. (au risque d'invalider certaines des réponses, qui ont vérifié les variables au lieu des paramètres et sont donc invalides de toute façon, car elles n'ont pas répondu à la question)
Stephan
1
OK merci Stephan, je ne savais pas que tu pouvais faire ça. J'ai modifié ma réponse pour refléter la mise à jour.
AutoMattTick
6

Utilisez "IF DEFINED variable command" pour tester la variable dans le fichier de commandes.

Mais si vous voulez tester les paramètres du lot, essayez les codes ci-dessous pour éviter les entrées délicates (comme "1 2" ou ab ^> cd)

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

Je teste avec le code ci-dessous et c'est très bien.

@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
la source
Votre solution échoue lorsque la variable contient un devis. Btw il existe la syntaxe IF DEFINED varpour une raison
jeb
4

J'utilise habituellement ceci:

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

Si% 1 est vide, l'IF comparera "." à "." qui sera évalué à vrai.

aphorie
la source
4
Ceci est une erreur. C'est la même chose que: SI "% 1" == "" la raison de ce message était que si% 1 lui-même avait des guillemets, cela échouait.
blak3r
Essayez-vous de tester si% 1 est vide ou s'il contient des guillemets? La question n'est pas claire. Ma réponse fonctionne si rien n'est spécifié sur la ligne de commande pour% 1.
aphoria
> Essayez-vous de tester si% 1 est vide ou s'il contient des guillemets? @aphoria, il doit être capable de gérer les deux.
Synetech
J'ai utilisé cela pour déterminer si% 1% avait été défini, fonctionnait bien pour moi. Merci, bonne réponse!
Charlie A
4

J'ai créé ce petit script batch basé sur les réponses ici, car il y en a beaucoup de valides. N'hésitez pas à ajouter à cela tant que vous suivez le même format:

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
la source
4

La chaîne vide est une paire de double-quotes/ "", nous pouvons simplement tester la longueur:

set ARG=%1
if not defined ARG goto nomore

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

puis testez 2 caractères contre double-quotes:

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

Voici un script batch avec lequel vous pouvez jouer. Je pense qu'il attrape correctement la chaîne vide.

Ceci est juste un exemple, vous avez juste besoin de personnaliser 2 (ou 3?) Étapes ci-dessus en fonction de votre script.

@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

Ce résultat du test de torture:

.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
la source
C'est faux, une chaîne vide n'est pas une chaîne avec deux guillemets doubles ""une chaîne vide est une chaîne vide '' et en batch une variable vide est une variable non définie. Vous pouvez définir que pour vos arguments, les guillemets externes seront supprimés, mais la chaîne est toujours vide avec une longueur de 0
jeb
Dans ce contexte (arguments win cmd), vous ne pouvez pas désigner une chaîne vide d'une autre manière, pas même avec des guillemets doubles qui se vident également sous le shell unix.
user6801759
Oui, ""sont également utilisés pour les chaînes vides, mais il est assez facile à utiliser %~1pour supprimer les guillemets externes. il n'est pas nécessaire d'utiliser une solution aussi complexe
jeb
Vous avez raison, je pourrais dire à tort, ce n'est pas seulement pour une chaîne vide, mais un moyen sûr d'énumérer les arguments. D'autres façons telles que celles "%~1"==""qui échoueront avec un argument comme "Long File Name".txtlequel est un argument valide. edit : Et ce n'est certainement pas complexe comme vous l'avez dit. Seulement 2 étapes ci-dessus pour le test, le reste est un exemple détaillé.
user6801759
"si non défini ARG" semble fonctionner parfaitement (ma variable ne vient pas de la ligne de commande)
GrayFace
3

Script 1:

Entrée ("Remove Quotes.cmd" "Ceci est un 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

Sortie (il n'y en a pas,% 1 n'était PAS vide, vide ou NULL):


Exécutez ("Remove Quotes.cmd") sans aucun paramètre avec le script ci-dessus 1

Sortie (% 1 est vide, vide ou NULL):

Welcome!

Press any key to continue . . .

Remarque: Si vous définissez une variable dans une IF ( ) ELSE ( )instruction, elle ne sera disponible pour DEFINED qu'après avoir quitté l'instruction "IF" (sauf si "Expansion de variable retardée" est activée; une fois activée, utilisez un point d'exclamation "!" À la place de la symbole de pourcentage "%"}.

Par exemple:

Script 2:

Entrée ("Remove Quotes.cmd" "Ceci est un 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

Production:

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>  

Remarque: Il supprimera également les guillemets de l'intérieur de la chaîne.

Par exemple (en utilisant le script 1 ou 2): C: \ Users \ Test \ Documents \ Batch Files> "Remove Quotes.cmd" "Ceci est" un "Test"

Sortie (Script 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  

Exécutez ("Remove Quotes.cmd") sans aucun paramètre dans le script 2:

Production:

Welcome!

Press any key to continue . . .
M. Rick
la source
3

Pour résumer:

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

Ce code affichera "Chaîne vide" si% 1 est "" ou "ou vide. Ajouté à la réponse acceptée qui est actuellement incorrecte.

GrayFace
la source
0

J'ai eu beaucoup de problèmes avec beaucoup de réponses sur le net. La plupart fonctionnent pour la plupart des choses, mais il y a toujours un cas d'angle qui casse chacun.
Peut-être que cela ne fonctionne pas s'il a des guillemets, peut-être qu'il se casse s'il n'a pas de guillemets, une erreur de syntaxe si le var a un espace, certains ne fonctionneront que sur les paramètres (par opposition aux variables d'environnement), d'autres techniques permettent un vide ensemble de guillemets à passer comme «définis», et certains plus délicats ne vous laisseront pas enchaîner elsepar la suite.

Voici une solution dont je suis satisfait, faites-le moi savoir si vous trouvez un cas d'angle pour lequel il ne fonctionnera pas.

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

Avoir ce sous-programme soit dans votre script, soit dans le sien .bat, devrait fonctionner.
Donc si vous vouliez écrire (en pseudo):

if (var)
then something
else somethingElse

Tu peux écrire:

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

Cela a fonctionné pour tous mes tests:

(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


Plus d'exemples:

  • Tu veux juste vérifier if?Call :ifSet %var% && Echo set
  • Si non (seulement le reste)? Call :ifSet %var% || Echo set
  • Vérification d'un argument passé; fonctionne bien.Call :ifSet %1 && Echo set
  • Vous ne vouliez pas obstruer vos scripts / code dupe, alors vous le mettez dans le sien ifSet.bat? Aucun problème:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
Hashbrown
la source
Trouvé un cas; Si vous essayez la syntaxe if avec else et que la dernière commande du bloc then échoue, else exécutera (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echotrue false
:,
En fait, si c'est un problème et que vous pouvez gérer une ligne supplémentaire, vous pouvez atténuer cela en appelant par ifSetlui-même, puis en utilisantIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown
Dans quels cas la réponse acceptée (utiliser des crochets) ne fonctionne-t-elle pas? Et pouvez-vous expliquer ce que fait l'Exit / B
blak3r
pour une raison quelconque, lorsque je l'ai testé, il s'est cassé lors de l'utilisation de setvariables (comme [%bob%], ne fonctionnant que pour des arguments comme [%2]), mais maintenant, il vérifie à nouveau que cela fonctionne. Je suppose que mon seul reproche []est qu'il laisse passer les guillemets vides, alors que cela ne va pas (donc c'est à votre cas d'utilisation, vraiment)
Hashbrown
Le /Bdrapeau empêche la sortie du lot entier, uniquement la sortie du sous-programme ou calldu lot. À moins que vous ne demandiez ce que fait toute la commande ; il renvoie un code d'erreur pour permettre au script appelant de connaître le résultat du sous-programme ( 0réussite, 1échec), utilisable via une logique booléenne dans la réponse, ou via %errorlevel%dans les commentaires ci-dessus
Hashbrown
0

En utilisant ! au lieu de "pour la vérification de chaîne vide

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
Lin W
la source
1
L'astuce est vraiment mauvaise. Les citations peuvent au moins gérer les espaces et les caractères spéciaux, mais pas les points d'exclamation. Et les points d'exclamation deviennent vraiment désagréables ici lorsque l'extension retardée est activée
jeb
0

Je suis entré il y a un peu moins d'un mois (même si cela a été demandé il y a 8 ans) ... J'espère qu'il / elle a déjà dépassé les fichiers batch. ;-) J'avais l'habitude de faire ça tout le temps. Je ne sais pas quel est le but ultime, cependant. S'il est paresseux comme moi, mon go.bat fonctionne pour des trucs comme ça. (Voir ci-dessous) Mais, 1, la commande dans l'OP peut être invalide si vous utilisez directement l'entrée en tant que commande. c'est à dire,

"C:/Users/Me"

est une commande non valide (ou utilisée si vous étiez sur un autre lecteur). Vous devez le casser en deux parties.

C:
cd /Users/Me

Et, 2, que signifie «défini» ou «non défini»? GIGO. J'utilise la valeur par défaut pour détecter les erreurs. Si l'entrée n'est pas interceptée, elle tombe pour aider (ou une commande par défaut). Donc, aucune entrée n'est pas une erreur. Vous pouvez essayer de cd à l'entrée et attraper l'erreur s'il y en a une. (Ok, utiliser les téléchargements go "(un seul paren) est pris par DOS. (Dur!))

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

Et, 3, les guillemets sont nécessaires uniquement autour du chemin, pas de la commande. c'est à dire,

"cd C:\Users" 

était mauvais (ou habitué autrefois), sauf si vous étiez sur un autre lecteur.

cd "\Users" 

est fonctionnel.

cd "\Users\Dr Whos infinite storage space"

fonctionne si vous avez des espaces sur votre chemin.

@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
la source
il y a une raison pour cd« /dchanger»: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is «non» /).
Stephan