Windows 7 Professional 64 位批处理文件中的 %%f

Windows 7 Professional 64 位批处理文件中的 %%f

我在几个批处理文件中有如下一行:

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_DWORDREGEDIT.EXE

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

和/或

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

0x10x0。用户特定设置优先于机器设置。命令行开关优先于注册表设置。

在批处理文件中,SETLOCAL ENABLEEXTENSIONSDISABLEEXTENSIONS参数优先于/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 变量中其他文件夹的前面,这是我上次安装时的情况(现在这次安装时也是如此)。

只是喜欢这些微妙的小问题。

感谢所有的投入。 :)

相关内容