Eu tenho uma pergunta sobre a estrutura if-else em um arquivo em lotes. Cada comando é executado individualmente, mas eu não poderia usar os blocos "if - else" com segurança para que essas partes do meu programa não funcionem. Como posso fazer essas peças funcionarem? Obrigado.
IF %F%==1 IF %C%==1 (
::copying the file c to d
copy "%sourceFile%" "%destinationFile%"
)
ELSE IF %F%==1 IF %C%==0 (
::moving the file c to d
move "%sourceFile%" "%destinationFile%"
)
ELSE IF %F%==0 IF %C%==1 (
::copying a directory c from d, /s: boş olanlar hariç, /e:boş olanlar dahil
xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
)
ELSE IF %F%==0 IF %C%==0 (
::moving a directory
xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
rd /s /q "%sourceMoveDirectory%"
)
batch-file
if-statement
epônimo
fonte
fonte
{}
botão; ajuda a tornar as postagens mais legíveis e evita alguns problemas com a marcação. Em resposta à sua pergunta, ele faz agora! Ao escrever uma pergunta, há uma prévia abaixo para que você possa ver como ela ficará depois de publicada.Respostas:
Sua sintaxe está incorreta. Você não pode usar
ELSE IF
. Parece que você realmente não precisa disso. Basta usar váriasIF
instruções:Grande referência de arquivo em lote: http://ss64.com/nt/if.html
fonte
&&
em váriasif
condições. Veja minha sintaxe alternativa.IF condition1 IF condition 2
ELSE IF
? Funciona bem no Win7. Veja exemplo: paste2.org/G8tMae92Penso na pergunta e em algumas das respostas que há um pouco de confusão sobre o significado desse pseudocódigo no DOS: SE A SE BX MAIS Y. Isso não significa SE (A e B) ENTÃO X OU MAIS Y, mas em fato significa SE A (SE B ENTÃO X OU MAIS Y). Se o teste de A falhar, todo o if-else interno será ignorado.
Como uma das respostas mencionadas, neste caso, apenas um dos testes pode ser bem-sucedido, de modo que o 'else' não é necessário, mas é claro que só funciona neste exemplo, não é uma solução geral para se fazer o else.
Existem muitas maneiras de contornar isso. Aqui estão algumas idéias, todas são bastante feias, mas ei, isso é (ou pelo menos foi) o DOS!
fonte
set
não precisam de sinais de porcentagem; deveria serset one=1
Como você não pode fazer um
if else
lote como em outros idiomas, ele deve ser aninhadoif
.Usando aninhados
if
, seu lote seria semelhanteou, como James sugeriu, encadeie os seus
if
, no entanto, acho que a sintaxe apropriada éfonte
if else
, especialmente em idiomas do tipo C, também é apenas um aninhadoif
. Você também não precisa aninhá-los com blocos em arquivos em lotes.else if
combinação é apenas um aninhado,if
mas não achei que você pudesse usar essas palavras-chave juntas em lote, como é possível nos idiomas C.Eu acredito que você pode usar algo como
fonte
do foo
edo bar
.IF (test) (command) ELSE IF (test) (command)
, está implicandoIF (test) (command) ELSE (IF (test) (command))
. Às vezes, isso pode funcionar, mas se você acredita que é uma estrutura de programação real aceitável no DOS, será uma PITA para solucionar problemas quando falhar.Um pouco atrasado e talvez ainda seja bom para condições if complexas, porque eu gostaria de adicionar um parâmetro "done" para manter uma estrutura if-then-else:
fonte
IF...ELSE IF
construções funcionam muito bem em arquivos em lote, principalmente quando você usa apenas uma expressão condicional em cada linha IF:No seu exemplo, você usa
IF...AND...IF
type construct, em que 2 condições devem ser atendidas simultaneamente. Nesse caso, você ainda pode usar aIF...ELSE IF
construção, mas com parênteses extras para evitar incertezas para a próxima condição ELSE:A construção acima é equivalente a:
A sequência de processamento dos comandos em lote depende da ordem de análise do CMD.exe . Apenas certifique-se de que sua construção siga essa ordem lógica e, como regra geral, funcionará. Se o script em lote for processado pelo Cmd.exe sem erros, significa que esta é a construção correta (isto é, suportada pela versão do OS Cmd.exe), mesmo se alguém disser o contrário.
fonte
Aqui está o meu código Exemplo para if..else..if
que faz o seguinte
Solicitar ao usuário o Nome do Processo
Se o nome do processo for inválido
, será gravado no usuário
se o nome do processo for services
, será gravado no usuário
se o nome do processo for válido e não serviços
, será gravado no usuário
o processo foi morto via
taskill
então eu o chamei Process killer.bat
Aqui está o meu código:
fonte
aqui está como eu lidei se mais se situação
Observe que não é o mesmo bloco if-elseif que as outras linguagens de programação como C ++ ou Java, mas fará o que você precisa fazer
fonte