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, endlocal
na próxima linha ou mesmo em uma próxima linha em branco).No entanto, usar %1
em 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 bar
e 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")