여러 배치 파일에 다음과 같은 줄이 있습니다.
FOR %%f IN (%*) DO something.exe %%f
나는 문제없이 오랫동안 사용했습니다. 최근에 하드 드라이브를 교체해야 했고, 제가 아는 한 이전과 마찬가지로 Windows 7을 다시 설치했습니다. 이제 이런 종류의 줄이 포함된 배치 파일을 실행하면 "%*"가 사전 처리되지 않습니다. 따라서 "XXX.bat *.txt"와 같은 경우 다음을 얻습니다.
입력 파일 "*.txt"를 열 수 없습니다.
저는 Parallels에서 Windows 7을 가상 머신으로 실행하고 있으며 버전 8에서 10으로 업그레이드했습니다. 그들은 또한 내 Mac OS를 Mountain Lion에서 Yosemite로 업그레이드했습니다.
더욱 이상한 점은 이 작은 배치 파일이 잘 작동한다는 것입니다.
@ECHO off
FOR %%f IN (%*) DO start gvim %%f
하지만 이것은 찾을 수 없다는 메시지를 제공합니다. (여기서 t?는 t1, t2 및 t3으로 구문 분석되어야 합니다):
@ECHO off
FOR %%f IN (%*) DO af2.exe %%f
그리고 여기에 "시작"을 추가해 보았지만 결과는 같았습니다.
아마도 더 간단하게 말하면 다음과 같습니다.
이것은 작동합니다:
af2 2014A 2014B 2014C
하지만 이것은:
af2 2014?
"2014?"라는 파일에 액세스하려고 하면 오류가 발생합니다.
그리고 af2는 각 파일에 대해 제가 작성하고 20년 이상 사용해 온 프로그램을 호출하여 파일에 대한 몇 가지 통계만 제공합니다.
답변1
어떤 이유로 명령 확장이 비활성화되었습니다. 명령 확장에는 다음에 대한 심각한 변경이 포함됩니다.명령줄 인수(Parameters)에 따라 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
또는 인수가 또는 스위치DISABLEEXTENSIONS
보다 우선합니다 . 자세한 내용은 참조하세요 ./E:ON
/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 변수의 다른 폴더보다 앞에 있습니다(이제 이 폴더에서도 수행됩니다).
그 미묘한 작은 문제를 좋아해야합니다.
모든 의견을 보내주셔서 감사합니다. :)