Como posso verificar se um argumento é definido quando iniciar / chamando um arquivo de lote?

StackOverflow https://stackoverflow.com/questions/830565

  •  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?

Foi útil?

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 ou directory?) Ou um string 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top