Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file /F的命令行失败_Batch File_For Loop_Cmd_Windows Server 2008 R2 - Fatal编程技术网

Batch file /F的命令行失败

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 工作正常,因此未正确遵守/

我有一个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
工作正常,因此未正确遵守/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
    。非常感谢你的帮助。