Refiro-me à pergunta Adicionar texto ao final do nome do arquivo (mas antes da extensão) usando o arquivo em lotes, pois tenho o mesmo problema. Usando o Windows 7 32-bit Enterprise (eu sei, eu sei...) com todas as atualizações escrevi um pequeno arquivo de lote pdfrename.bat
com apenas três linhas:
um comentário, começando com
REM
e sem sinal de continuação "oculto" mais à direita da linhao comando proposto, copiado e colado da fonte conforme fornecido por @Karan , comentado com
REM
o comando adotado para batch (duplicando o
%
):REM Rework 2020-12-16 REM for %a in (*.txt) do ren "%~a" "%~na version 1%~xa" for %%F in (*.pdf) do ren "%%~F" "%%~nF OdB%%~xF"
Executando o comando (3.) no prompt de comando,
for %F in (*.pdf) do ren "%~F" "%~nF OdB%~xF"
funciona bem.
Mas a execução de todo o arquivo em lotes pdfrename.bat
do Windows Explorer falha. A execução do arquivo em lotes no prompt de comando pdfrename.bat
produz um erro de sintaxe de mensagem de erro:
Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~na version 1%~xa"
[...]
Você não precisa entender alemão. O ponto importante é que a mensagem de erro se refere à segunda linha comentada (2.), não à terceira linha!
Tentei redigitar REM
, inseri uma tabulação após o REM, inseri uma segunda REM
após a primeira ( REM REM ....
), inseri uma terceira linha após a segunda com o mesmo conteúdo e excluí a segunda linha depois - nada mudou: o arquivo de lote termina no comentado segunda linha com um erro de sintaxe. Assim que a segunda linha incriminada é eliminada do lote, o lote funciona bem.
Eu procurei por "REM é ignorado", mas sem sorte, então eu posto o assunto aqui. Eu nunca ouvi falar ou experimentei antes que o processador de comandos tenta pelo menos analisar uma linha comentada - e no caso de haver algo errado com o código após o sinal de comentário que ele encerra o script em lote.
A mensagem de erro refere-se à segunda linha comentada
Isso se deve à análise muito complexa usada
cmd
para processar scripts.Em suma, o analisador processa
%
antes de praticamente todo o resto (fase 1) e gera um erro, pois alguns dos%
s precisam ser duplicados como%%
quando usados em um arquivo em lotes.Então, em um arquivo de lote:
é um comando válido e:
é um comando quebrado (o
%a
deve ser%%a
, etc).Observe que:
é um comando válido quando executado a partir da linha de comando, pois
%
não precisa ser duplicado.REM
seria processado na fase 2 do analisador, mas nunca chega lá, pois o%
processamento na fase 1 já gerou um erro e encerrou a análise.Para todos os detalhes sangrentos do
cmd
analisador, leia análise - Como o Windows Command Interpreter (CMD.EXE) analisa scripts? - Estouro de pilhaNão funciona porque, embora seja "observado", é avaliado para substituições e , aparentemente, descartado.
Para "lote" sua segunda linha está incorreta e deve ser lida
As correções são que nas expansões de programação em lote precisam ter %% em vez de um único %.
Para adicionar às respostas existentes, embora
REM
seja usado para comentários, é importante entender que na verdade é um comando que não faz nada, não um comentário. Isso é diferente de um shell Unix, onde você tem comentários reais e pode adicionar texto arbitrário após um#
caractere.Não apenas os substitutos são avaliados para o
REM
comando, também os redirecionamentos de arquivo. Portanto, cuidado que a linha a seguir excluirá o conteúdo do arquivo, pois oREM
comando não produz saída, mas a saída vazia será redirecionada para o arquivoEditar
Como um comentário apontou, isso não é mais verdade para as versões modernas do Windows. De acordo com https://stackoverflow.com/a/4095133/10765659 agora há tratamento especial de
REM
para que os redirecionamentos não sejam executados, mas esse tratamento especial ocorre tarde demais para fazerREM
um comentário verdadeiro, pois os substitutos ainda são avaliados.