我在幾個批次文件中有如下行:
FOR %%f IN (%*) DO something.exe %%f
我已經使用它們很長時間了,沒有任何問題。據我所知,我最近不得不更換硬碟並重新安裝了 Windows 7。現在,當我運行任何包含此類行的批次檔時,它們不會預處理“%*”。因此,對於“XXX.bat *.txt”之類的內容,我得到:
無法開啟輸入檔“*.txt”
我在 Parallels 中將 Windows 7 作為虛擬機器運行,從版本 8 升級到 10,如果這有什麼區別的話。他們還將我的 Mac 作業系統從 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
由於某種原因命令擴充被禁用。命令擴充涉及重大更改命令列參數(參數)按照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 變數中的其他資料夾之前,這在我之前的安裝中是這樣做的(現在在這個安裝中也是如此)。
只是一定要喜歡那些微妙的小問題。
感謝所有的投入。 :)