Eu tenho uma linha como a seguinte em vários arquivos em lote:
FOR %%f IN (%*) DO something.exe %%f
Eu os uso há muito tempo sem nenhum problema. Recentemente, tive que substituir meu disco rígido e reinstalar o Windows 7 exatamente como estava antes, pelo que eu sei. Agora, quando executo qualquer um dos arquivos em lote com esse tipo de linha, eles não estão pré-processando "%*". Então, para algo como "XXX.bat *.txt", recebo:
Não foi possível abrir o arquivo de entrada "*.txt"
Estou executando o Windows 7 como uma máquina virtual no Parallels, atualizada da versão 8 para a 10, se isso faz diferença. Eles também atualizaram meu Mac OS do Mountain Lion para o Yosemite.
Ainda mais estranho, este pequeno arquivo em lote funciona bem:
@ECHO off
FOR %%f IN (%*) DO start gvim %%f
Mas este dá a mensagem de que não consegue encontrar? (onde t? deve ser analisado como t1, t2 e t3):
@ECHO off
FOR %%f IN (%*) DO af2.exe %%f
E tentei adicionar o "start" a ele, mesmos resultados.
Talvez uma maneira mais simples de dizer isso seja:
Isso funciona:
af2 2014A 2014B 2014C
Mas isso:
af2 2014?
dá um erro ao tentar acessar um arquivo chamado "2014?"
E o af2 chama, para cada arquivo, um programa que escrevi e uso há mais de 20 anos, que fornece apenas algumas estatísticas sobre um arquivo.
Responder1
As extensões de comando estão desativadas por algum motivo. As extensões de comando envolvem mudanças sériasArgumentos de linha de comando (parâmetros)conforme CALL /?
.
No entanto, o próximo trecho CMD /?
mostra algumas dicas de solução:
As extensões de comando são habilitadas por padrão. Você também pode desabilitar extensões para uma invocação específica usando a
/E:OFF
opção. Você pode ativar ou desativar extensões para todas as invocações emCMD.EXE
uma máquina e/ou sessão de logon de usuário definindo um ou ambos osREG_DWORD
valores a seguir no registro usandoREGEDIT.EXE
:HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions
e/ou
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions
para um
0x1
ou0x0
. A configuração específica do usuário tem precedência sobre a configuração da máquina. As opções de linha de comando têm precedência sobre as configurações do registro.Em um arquivo em lote, os argumentos
SETLOCAL ENABLEEXTENSIONS
ouDISABLEEXTENSIONS
têm precedência sobre a opção/E:ON
ou/E:OFF
. VejaSETLOCAL /?
para detalhes.
Exemplo
==>type D:\bat\cliParser.bat
@echo OFF >NUL
echo all %%* = %*
set /A "ii=0"
:loopfor
echo param %%%ii% = %0
SHIFT
set /A "ii+=1"
if not [%0]==[] goto :loopfor
goto :eof
==>D:\bat\cliParser.bat aaa bbb
all %* = aaa bbb
param %0 = D:\bat\cliParser.bat
param %1 = aaa
param %2 = bbb
==>cmd /E:OFF /C D:\bat\cliParser.bat aaa bbb
all %* = *
The syntax of the command is incorrect.
param %3 = D:\bat\cliParser.bat
The syntax of the command is incorrect.
param %3 = aaa
The syntax of the command is incorrect.
param %3 = bbb
The syntax of the command is incorrect.
The system cannot find the batch label specified - eof
==>
Responder2
Eu descobri o problema. Eu tenho uma pasta na minha área de trabalho com vários arquivos .exe de programas que escrevi. Ele também possui uma pasta com alguns arquivos .bat. Em muitos casos, o arquivo .bat chama um dos arquivos .exe que tem o mesmo nome raiz (af2.bat chama af2.exe). Isso funciona bemSEa pasta com os arquivos .bat precede a outra pasta na variável PATH, o que aconteceu na minha instalação anterior (e agora nesta).
Só tenho que amar esses pequenos problemas sutis.
Obrigado por todas as contribuições. :)