%%f em um arquivo em lote com Windows 7 Professional de 64 bits

%%f em um arquivo em lote com Windows 7 Professional de 64 bits

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:OFFopção. Você pode ativar ou desativar extensões para todas as invocações em CMD.EXE uma máquina e/ou sessão de logon de usuário definindo um ou ambos os REG_DWORDvalores a seguir no registro usando REGEDIT.EXE:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

e/ou

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

para um 0x1ou 0x0. 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 ENABLEEXTENSIONSou DISABLEEXTENSIONStêm precedência sobre a opção /E:ONou /E:OFF. Veja SETLOCAL /?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. :)

informação relacionada