У меня в нескольких пакетных файлах есть строка следующего вида:
FOR %%f IN (%*) DO something.exe %%f
Я использовал их долгое время без проблем. Недавно мне пришлось заменить жесткий диск и переустановить Windows 7, как и было раньше, насколько я знаю. Теперь, когда я запускаю любой из пакетных файлов с такой строкой, они не обрабатывают "%*". Поэтому для чего-то вроде "XXX.bat *.txt" я получаю:
Невозможно открыть входной файл "*.txt"
Я использую Windows 7 как виртуальную машину в Parallels, обновленную с версии 8 до 10, если это имеет значение. Они также обновили мою Mac OS с Mountain Lion до Yosemite.
Еще более странно, что этот небольшой пакетный файл работает нормально:
@ECHO off
FOR %%f IN (%*) DO start gvim %%f
Но этот выдает сообщение, что не может найти t? (где t? следует разбить на t1, t2 и t3):
@ECHO off
FOR %%f IN (%*) DO af2.exe %%f
Я попробовал добавить к нему «старт», результат тот же.
Возможно, проще сказать так:
Это работает:
af2 2014A 2014B 2014C
Но это:
аф2 2014?
выдает ошибку при попытке доступа к файлу с названием «2014?»
А af2 вызывает для каждого файла программу, которую я написал и использую уже более 20 лет, и которая просто выдает некоторую статистику по файлу.
решение1
Расширения команд отключены по какой-то причине. Расширения команд подразумевают серьезные изменения вАргументы командной строки (параметры)согласно CALL /?
.
Однако следующий отрывок из CMD /?
показывает некоторые подсказки по решению:
Расширения команд включены по умолчанию. Вы также можете отключить расширения для определенного вызова с помощью переключателя
/E:OFF
. Вы можете включить или отключить расширения для всех вызововCMD.EXE
на компьютере и/или сеансе входа пользователя, установив одно или оба из следующихREG_DWORD
значений в реестре с помощьюREGEDIT.EXE
:HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions
и/или
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions
либо
0x1
или0x0
. Пользовательская настройка имеет приоритет над настройкой машины. Параметры командной строки имеют приоритет над настройками реестра.В пакетном файле аргументы
SETLOCAL ENABLEEXTENSIONS
orDISABLEEXTENSIONS
имеют приоритет над переключателем/E:ON
or/E:OFF
.SETLOCAL /?
Подробности см.
Пример
==>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
==>
решение2
Я разобрался с проблемой. У меня на рабочем столе есть папка с кучей .exe-файлов из написанных мной программ. В ней также есть папка с некоторыми .bat-файлами. Во многих случаях .bat-файл вызывает один из .exe-файлов с тем же корневым именем (af2.bat вызывает af2.exe). Это работает отличноЕСЛИпапка с файлами .bat предшествует другой папке в переменной PATH, как это было в моей предыдущей установке (и происходит сейчас в этой).
Просто обожаю эти тонкие маленькие проблемы.
Спасибо за все вклады. :)