Batch file /F的命令行失败
我有一个DOS构建脚本,可以在一台Windows Server 2008 R2上运行,但不能在另一台上运行。要查看损坏机器的症状,请在命令行输入以下任一项:Batch file /F的命令行失败,batch-file,for-loop,cmd,windows-server-2008-r2,Batch File,For Loop,Cmd,Windows Server 2008 R2,我有一个DOS构建脚本,可以在一台Windows Server 2008 R2上运行,但不能在另一台上运行。要查看损坏机器的症状,请在命令行输入以下任一项: for /f %X in ('dir /b *.txt') do @echo %X for /f "usebackq" %X in (`dir /b *.txt`) do @echo %X 给出:“'dir/b*.txt'不被识别为内部或外部命令。” for %X in (*.txt) do @echo %X 工作正常,因此未正确遵守/
for /f %X in ('dir /b *.txt') do @echo %X
for /f "usebackq" %X in (`dir /b *.txt`) do @echo %X
给出:“'dir/b*.txt'不被识别为内部或外部命令。”
for %X in (*.txt) do @echo %X
工作正常,因此未正确遵守/f。我不相信这是命令扩展本身(启动cmd/x会显示相同的行为;在问题服务器上的cmd/y中运行它们会产生正常的“/f此时是意外的”)。我还检查了command extensions注册表项,并在批处理文件中尝试了“setlocal enableextensions”
我不认为这有什么关系,但服务器之间的区别在于,出现故障的服务器是物理的;它的CPU没有VT扩展;是否安装了McAfee。据我所知,它们的安装方式相同,但时间不同
有人有什么建议吗?我被卡住了 在批处理文件中,必须使用双百分比,即%%X。 在命令行中,可以使用单个百分比
至于为什么它能在一台机器上工作,不确定,也许它是通过16位DOS在工作的机器上运行的?或者它是一个不同的测试,似乎在变量替换不起作用的情况下工作。在不起作用的机器上检查
COMSPEC
环境变量,即执行echo%COMSPEC%
并查看它包含什么(它应该是%windir%\system32\cmd.exe
或类似)
说来话长:
您的详细问题排除了所有其他可能的可能性(例如,与命令行相比,需要在批处理文件中使用%%X
而不是%X
),例如摆弄setlocal enableextensions
(或类似的开关、注册表项等)。顺便说一句,错误消息不合适
如果您收到错误消息“…未被识别为内部或外部命令”,则表明CMD.EXE无法找到您尝试执行的命令。由于“dir”是一个内部命令,“这当然不应该发生”
我可以通过以下操作重现您的错误:
CMD.EXE
SET ComSpec=DoesNotExist
CMD.EXE
,即启动另一个嵌套的CMD.EXE
会话。此步骤是必需的,在运行的CMD.EXE
会话中,对ComSpec
的更改似乎没有被注意到CMD.EXE
会话中输入命令(例如,'dir/b')do@echo%x中的/F%x的),您应该会看到错误。注意,如果您只输入dir
,它仍将工作,因此您必须通过for
循环等方式进行“间接”执行。好笑
请注意,这一切都是为了重现您所看到的,导致系统出现这种行为的确切环境或设置条件可能不同,但是,
ComSpec
环境变量引用的不是CMD.EXE
,这一事实应该是相同的。看起来命令行扩展没有激活。在执行for-loop之前,请尝试setlocal enableextensions
。谢谢,但我已经尝试过了(之后errorlevel为0)。这是正确的,但是OP明确表示他在命令行上测试了它。对不起,我的错误。。仅仅运行“dir/b*.txt”就行了(应该可以)。您运行的是:对于/f%X in('set')执行@echo%X
/对于/f%X in('ver')执行@echo%X
?它们分别给出了'set'未被识别…
和'ver'未被识别…
。实际上,环境似乎并没有按照@Christian.K所指示的方式在for
中被继承。(%comspec%/c dir
也适用于set或ver。)有趣的是,是的,在好的机器上,repo是症状,但是在这两种情况下%comspec%都是c:\Windows\System32\cmd.exe。如果上下文相关,则将坏机器设置为与好机器不同的DC;问题确实发生在(域)管理员身上;所有访问都在控制台上,而不是rdp上。对于调试,将cmd.exe复制到某个地方,直接设置权限并指向comspec有意义吗?我来试试。@StuartBrown你在哪里检查了%ComSpec%
的值?直接在出现问题的shell中?是的,我只是启动->键入cmd->echo%comspec%
,不幸的是,这一切看起来都很好,例如,%comspec%
启动了一个嵌套会话,其中dir在这两台机器上都起作用-版本6.1.7601,将cmd.exe复制到某个地方并指向comspec,也会出现同样的情况。这就是问题所在..%comspec%在坏掉的机器上有双引号;我不知道为什么。对于记录,这是在Process Monitor中诊断的-对于例如路径C:\Users\Administrator\“C:\Windows\System32\cmd.exe”
,存在结果NAME INVALID
。非常感谢你的帮助。