我在几个批处理文件中有如下一行:
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? 的消息(其中 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 变量中其他文件夹的前面,这是我上次安装时的情况(现在这次安装时也是如此)。
只是喜欢这些微妙的小问题。
感谢所有的投入。 :)