Как я могу проверить, определен ли аргумент при запуске / вызове пакетного файла? - PullRequest
86 голосов
/ 06 мая 2009

Я пытаюсь использовать следующую логику проверки в командном файле, но блок «использования» никогда не выполняется, даже если в командный файл не передан никакой параметр.

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

Что я делаю не так?

Ответы [ 7 ]

132 голосов
/ 06 мая 2009

Проверка того, был ли установлен аргумент командной строки, может быть [%1]==[], но, как указывает Дейв Коста , "%1"=="" также будет работать.

Я также исправил синтаксическую ошибку в использовании echo для экранирования знаков «больше» и «меньше». Кроме того, exit требуется аргумент /B, в противном случае CMD.exe завершится.

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
16 голосов
/ 01 января 2016

Более продвинутый пример:

⍟ неограниченное количество аргументов.

⍟ существует в файловой системе (file или directory?) Или универсальный string.

⍟ указать, является ли файл

⍟ указать каталог

без расширений, будет работать в устаревших скриптах!

минимальный код ☺

@echo off

:loop
      ::-------------------------- has argument ?
      if ["%~1"]==[""] (
        echo done.
        goto end
      )
      ::-------------------------- argument exist ?
      if not exist %~s1 (
        echo not exist
      ) else (
        echo exist
        if exist %~s1\NUL (
          echo is a directory
        ) else (
          echo is a file
        )
      )
      ::--------------------------
      shift
      goto loop


:end

pause

✨ другие вещи ..✨

■ в %~1 - ~ удаляет любую обертку " или '.

■ в %~s1 - s делает путь равным DOS 8.3 naming, что является хорошим трюком, позволяющим избежать пробелов в имени файла при проверке содержимого (и, таким образом, нет необходимости переносить ресурс с большим количеством * 1038) * s.

["%~1"]==[""] «не может быть уверен», если аргумент - это файл / каталог или просто общая строка, поэтому вместо этого выражение использует скобки и исходный неизмененный %1 (просто без переноса " если есть ..)

если не было аргументов, если мы использовали shift и указатель arg-list прошел последний, выражение будет оценено как [""]==[""].

■ это настолько специфично, насколько это возможно, если не использовать больше трюков (это будет работать даже в пакетных скриптах Windows-95 ...)

■ примеры выполнения

сохранить как identifier.cmd

он может идентифицировать неограниченные аргументы (обычно вы ограничены %1 - %9), просто не забудьте обернуть аргументы кавычками, или использовать 8.3 именования, или перетаскивать их (автоматически выше).

<Ч />

это позволяет вам запускать следующие команды:

identifier.cmd c:\windows и получить

exist
is a directory
done
<Ч />

identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" и получить

exist
is a file
done
<Ч />

⓷ и несколько аргументов (конечно, это целая сделка ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

и получить

exist
is a directory
exist
is a file
exist
is a file
not exist
done.

естественно, это может быть намного сложнее, но хорошие примеры всегда должны быть простыми и минимальными. :)

Надеюсь, это кому-нибудь поможет:)

опубликовано здесь: CMD Ninja - Неограниченная обработка аргументов, идентификация наличия в файловой системе, идентификация файла или каталога

и вот рабочий пример, который берет любое количество APK-файлов (приложений Android) и устанавливает их на ваше устройство через debug-console (ADB.exe): Сделать предыдущее сообщение массовым установщиком APK, в котором не используется синтаксис ADB Install-Multi

14 голосов
/ 06 мая 2009

Избавьтесь от скобок.

Образец пакетного файла:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

Вывод из запущенного выше сценария:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

Я думаю, что на самом деле скобки являются частью строк, и они сравниваются.

6 голосов
/ 24 ноября 2014
IF "%~1"=="" GOTO :Usage

~ выведет из кавычки% 1, если сам% 1 будет в кавычках.

"" защитит от переданных специальных символов. например, вызов скрипта с помощью & ping

2 голосов
/ 02 мая 2012
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
0 голосов
/ 27 декабря 2018

Это то же самое, что и другие ответы, но использует только одну метку и ставит на первое место использование, что дополнительно делает его своеобразной документацией, рекомендующей скрипт, который также обычно помещается вверху:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

Однако, если вам не нужно использовать cmd / batch, использовать bash на WSL или powershell, они имеют более вменяемый синтаксис и меньше загадочных возможностей.

0 голосов
/ 26 декабря 2017

ЕСЛИ "% 1" == "" потерпит неудачу, все версии этого будут терпеть неудачу под определенные условия характера яда. Только ЕСЛИ ОПРЕДЕЛЕНО или ЕСЛИ НЕ ОПРЕДЕЛЕНО являются безопасными

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...