%%f в пакетном файле с Windows 7 Professional 64 бит

%%f в пакетном файле с Windows 7 Professional 64 бит

У меня в нескольких пакетных файлах есть строка следующего вида:

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 ENABLEEXTENSIONSor DISABLEEXTENSIONSимеют приоритет над переключателем /E:ONor /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, как это было в моей предыдущей установке (и происходит сейчас в этой).

Просто обожаю эти тонкие маленькие проблемы.

Спасибо за все вклады. :)

Связанный контент