Usando sinais de porcentagem (%) na instrução echo na mesma linha da verificação condicional IF da variável

Usando sinais de porcentagem (%) na instrução echo na mesma linha da verificação condicional IF da variável

Estou tentando usar esta linha em um arquivo em lote

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

e quando eu executo eu entendo isso

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(ARGUMENT = qualquer argumento/parâmetro que usei ao executar o arquivo em lote)

Eu tentei todos os tipos de variações, incluindo alterar "Log File.txt" para "LogFile.txt" e remover as aspas ao redor do caminho, e reduzi-o ao fato de que ele quebra sempre que há um  %sinal (de tentar ecoar uma variável) ou dois pontos (do caminho à direita do >>). Não tenho ideia de qual é o problema dos dois pontos, mas %parece que está sendo ganancioso e lendo a linha para significar que a variável que está sendo testada é toda a sequência concatenada de todo o conteúdo delimitado por um  %par mais o resto da linha (presumivelmente porque não há nenhum operador depois, então ele continua até o EOL, onde fica entre parênteses). Então parece que algo precisa ser escapado, há algo mais que preciso mudar ou simplesmente não é possível.

Sei que poderia simplesmente colocar a instrução echo em outra linha como esta

If NOT... (
  echo...
)

mas prefiro fazer isso em uma linha, em parte porque é mais limpo, mas principalmente porque sou curioso e gosto de descobrir coisas assim, e odeio quando não consigo.

Aliás, a expressão atrasada está habilitada.

EDIT: Com base no comentário de @AFH, testei-o sozinho em um arquivo em lote e descobri que este

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

não dá o erro mas colocandoqualquer coisadepois dele (por exemplo, endlocalna próxima linha ou mesmo em uma próxima linha em branco).No entanto, usar %1em vez de %1%, como mencionado pelo ADH, corrigiu o problema, então esse era o problema. Portanto isso está resolvido.

Responder1

Não consegui reproduzir seu erro exato, mas posso confirmarObservação de AFHque os parâmetros da linha de comando são (por exemplo,  , , etc.) e não , então seu comando deve ser%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

Acredito que posso esclarecer o que acontece quando você inclui o extra  %. O CMD parece analisar linhas de comando em busca de parâmetros e variáveis ​​antes de fazer qualquer outra coisa e usa um analisador muito simplista. Quando ele encontra um  %,

  • se o próximo caractere for um dígito, então é um parâmetro posicional;%n
  • se for qualquer outra coisa, é uma variável ( ), e%name%tudoaté o próximo %é oname. Eu acho que fica muito confuso se não houver uma correspondência %.

Então aqui está como seu comando é analisado:

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

Ele pensa que "=="foo" (echo e  Text. >> "são nomes de variáveis, enquanto bare USERPROFILEé texto literal. Por exemplo, executar seu comando com um argumento “olá” gerou esta mensagem de erro semelhante à que você obteve:

A sintaxe do comando está incorreta.
 
C:(diretório atual)> Se NÃO "hellobarUSERPROFILE\Desktop\Log File.txt")

informação relacionada