Estou tentando usar a seguinte lógica de validação em um arquivo em lote, mas o bloco "uso" nunca é executado, mesmo quando nenhum parâmetro é fornecido ao arquivo em lote.
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?
batch-file
arguments
Daniel Fortunov
fonte
fonte
Respostas:
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 funcionará.Também consertei um erro de sintaxe no eco de uso para escapar dos sinais de maior e menor. Além disso, o
exit
precisa de um/B
argumento, caso contrárioCMD.exe
será encerrado.fonte
set
variáveis (não sei a terminologia de lote correta), você pode querer usar"%myvar%"==""
porque semyvar
contiver espaços e não estiver entre aspas, você obterá o "inesperado neste momento " mensagem.IF NOT DEFINED VarName
bloco. Também +1 para tukushan por não usar aspas na comparação. Só não faça isso. Nunca."%~1"==""
também funcionará e cuidará do caso em que% 1 tem aspas duplas"%~1"==""
lida com espaços na variável, enquanto a[]
versão não.✨ outras coisas..✨
■ em
%~1
-~
remove qualquer embalagem"
ou'
.■ in
%~s1
- os
torna o caminhoDOS 8.3 naming
, que é um bom truque para evitar espaços no nome do arquivo ao verificar as coisas (e desta forma não há necessidade de envolver o recurso com mais"
s.■ o
["%~1"]==[""]
"não posso ter certeza" se o argumento é um arquivo / diretório ou apenas uma string genérica, então, em vez disso, a expressão usa colchetes e o original não modificado%1
(apenas sem a"
quebra, se houver ..)se não houver argumentos de se usamos
shift
e o ponteiro da lista de argumentos passou o último, a expressão será avaliada como[""]==[""]
.■ isso é o mais específico que você pode ser sem usar mais truques (funcionaria mesmo em scripts em lote do Windows 95 ...)
■ exemplos de execução
salve como
identifier.cmd
ele pode identificar argumentos ilimitados (normalmente você está limitado a
%1
-%9
), apenas lembre-se de envolver os argumentos com vírgulas invertidas, ou usar a nomenclatura 8.3, ou arrastar e soltar (automaticamente faz qualquer um dos itens acima).isso permite que você execute os seguintes comandos:
⓵
identifier.cmd c:\windows
e para obter⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
e para obter⓷ e vários argumentos (claro que isso é tudo ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
e para obter
naturalmente, pode ser muito mais complexo, mas bons exemplos devem ser sempre simples e mínimos. :)
Espero que ajude alguém :)
publicado aqui: CMD Ninja - processamento ilimitado de argumentos, identificando se existe no sistema de arquivos, identificando se o arquivo ou diretório
e aqui está um exemplo de trabalho que pega qualquer quantidade de arquivos APK (aplicativos Android) e os instala em seu dispositivo por meio do console de depuração (ADB.exe): Torne a postagem anterior um instalador de APK em massa que não usa a sintaxe de instalação múltipla ADB
fonte
Livre-se dos parênteses.
Arquivo de lote de amostra:
Resultado da execução do script acima:
Acho que os parênteses são parte das cordas e eles estão sendo comparados.
fonte
if "%1"==""
irá travar se o arg tiver espaços. Por exemplo:run.bat "a b"
. @amr tem a melhor resposta para usarif "%~1"==""
~ irá retirar as cotações de% 1 se o próprio% 1 for citado.
"" protegerá contra caracteres especiais passados. por exemplo, chamando o script com & ping
fonte
run.bat "a b"
run.bat ""
não será pego por[%1]==[]
.fonte
run.bat "a b"
Esta é a mesma que as outras respostas, mas usa apenas um rótulo e coloca o uso em primeiro lugar, o que adicionalmente faz com que sirva como uma espécie de recomendação de documentação do script que também é normalmente colocado no topo:
No entanto, se você não precisa usar cmd / batch, use bash em WSL ou powershell, eles têm uma sintaxe mais sã e menos recursos misteriosos.
fonte
SE "% 1" == "" falhar, todas as versões falharão sob certas condições de personagem envenenado. Somente IF DEFINED ou IF NOT DEFINED são seguros
fonte
if [not] defined ...
não funciona com parâmetros como%1
. Você tem um exemplo, ondeif "%~1" ...
não funciona?