Como posso verificar se um argumento é definido quando iniciar / chamando um arquivo de lote?
-
06-07-2019 - |
Pergunta
Eu estou tentando usar a seguinte lógica de validação em um arquivo de lote, mas o bloco de "uso" nunca executa mesmo quando nenhum parâmetro é fornecido para o arquivo em lotes.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
O que estou fazendo de errado?
Solução
A verificação para saber se um argumento de linha de comando foi definido pode ser [%1]==[]
, mas, como Dave Costa aponta , "%1"==""
também irá trabalho.
Eu também fixa um erro de sintaxe no eco uso para escapar da maior-que e menor do que sinais. Além disso, o exit
precisa de um argumento /B
outra forma CMD.exe
vai sair.
@echo off
if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
Outras dicas
Um exemplo mais avançado:
? argumentos ilimitadas.
? existe no sistema de arquivos (seja
file
oudirectory
?) Ou umstring
genérico.? especificar se é um arquivo
? especificar é um diretório
? não extensões, iria trabalhar em scripts legados!
? código mínimo ?
@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
? outra stuff..?
¦ em %~1
-. A ~
remove qualquer "
acondicionamento ou '
¦ em %~s1
-. A s
torna o caminho ser DOS 8.3 naming
, que é um bom truque para espaços evitar no file-name ao verificar o material (e desta forma não há necessidade de envolver o recurso com mais "
s
¦ a ["%~1"]==[""]
"não pode ter certeza" se o argumento é um arquivo / diretório ou apenas uma seqüência genérica ainda, então, em vez dos suportes usos expressão eo %1
original não modificado (apenas sem o envolvimento "
, se houver ..)
Se não houve argumentos de que nós temos shift
usadas e o ponteiro lista arg passou o último, a expressão será avaliado para [""]==[""]
.
¦ este é tanto específico você pode ser sem o uso de mais truques (que iria trabalhar mesmo em janelas de 95 lotes-scripts do ...)
¦ exemplos de execução
guardá-lo como identifier.cmd
pode-se identificar um argumentos ilimitados (normalmente você está limitado a %1
-%9
), lembre-se de embrulhar os argumentos com invertidos-vírgulas, ou usar de nomes 8.3, ou arraste e solte-os (ele automaticamente faz qualquer um dos acima).
isso permite que você execute os seguintes comandos:
?identifier.cmd c:\windows
E para obter
exist is a directory done
?identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
E para obter
exist is a file done
? e vários argumentos (é claro que isso é o todo-deal ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
E para obter
exist is a directory exist is a file exist is a file not exist done.
naturalmente ele pode ser muito mais complexa, exemplos mas agradáveis ??deve ser sempre simples e mínima :.)
Hope isso ajuda ninguém:)
publicada aqui: CMD Ninja - Argumentos ilimitados Processamento, identificando Se existir no sistema de arquivos, identificando Se arquivo ou diretório
e aqui está um exemplo de trabalho que leva qualquer quantidade de arquivos APK (Android apps) e instala-los no seu dispositivo via debug-console (ADB.exe): Faça o Post Anterior A Mass APK Installer que não usa ADB Instale-multi Sintaxe
se livrar dos parênteses.
arquivo de lote Amostra:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
saída da execução acima script:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
Eu acho que é realmente tomando os parênteses para fazer parte das cordas e eles estão sendo comparados.
IF "%~1"=="" GOTO :Usage
~ vai de-citação% 1% 1 se a si mesmo é citado.
"" vai proteger de caracteres especiais passou. por exemplo, chamando o script com & ping
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
IF "% 1" == "" irá falhar, todas as versões deste falhará sob certas condições de caracteres veneno. Só se definido ou se não for definida são seguros
Este é o mesmo que as outras respostas, mas usa apenas um rótulo e coloca o uso em primeiro lugar, que, adicionalmente, faz com que seja servir como uma espécie de elogiar a documentação do script que também é geralmente colocado no topo:
@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...
No entanto, se você não tem que usar cmd / lote, o uso bash em WSL ou powershell, eles têm sintaxe mais sã e características menos arcanos.