7

我有一个带有以下行的批处理文件(在 Windows XP 中,已激活命令扩展名):

for /f %%s in ('type version.txt') do set VERSION=%%s

在某些计算机上,它工作得很好(如this SO question所示),但在其他计算机上它会杀死cmd(控制台窗口刚刚关闭)

为什么 ?


注意:计算机似乎具有类似的配置:XpSP2,用户具有管理权限,在 HKEY_CURRENT_USER\Software\Microsoft\Command Processor 中没有定义“命令处理器”...

4

5 回答 5

5

我得到了第一个经验性答案:

for /f %%s in (version.txt) do ...

在每台计算机上都可以正常工作。

它似乎for /f适用于文件名,而不适用于任何 dos 命令,如“类型文件名”。

但是,这不适用于我所有客户的计算机(在某些情况下,“类型文件名”工作正常)

如果您想要 15(简单?)点 ;-),您可以回答这个问题:
为什么 'for /f' 有时除了文件名之外不能使用其他任何东西。为什么它只是关闭 DOS 会话?


编辑:3 年后(!),barlop遇到了类似的情况,在问题“for /f立即关闭 cmd 提示符? ”中有详细说明。他的结论是:

COMSPECSET+时确实列出了ENTER
所以,我打开了环境变量窗口,发现COMSPEC没有在用户或系统变量下列出。我将它添加到系统变量中,启动了命令提示符,它似乎工作正常。

Andriy M在回答 barlop 的问题时提到了ss64 论坛上的这个帖子,其中包含详细信息。

为了重新加载窗口,需要设置 " for" 循环中的脱壳以完成 ' dir'(或您要求完成的任何命令) 。ComSpeccmd

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ComSpec=
%SystemRoot%\system32\cmd.exe
于 2008-11-04T09:09:21.520 回答
1

关于命令扩展,有可能使用 /E:OFF 调用 CMD.EXE,以便禁用命令扩展(即使在注册表中启用)。

如果在脚本中使用命令扩展 shell 选项,强烈建议您在脚本开头执行以下技巧。

-- 从http://www.ss64.com/nt/setlocal.html粘贴的信息

如果给定一个参数,SETLOCAL 将设置一个 ERRORLEVEL。如果给出两个有效参数之一,则它将为零,否则为零。

您可以在批处理文件中使用它来确定命令扩展是否可用,使用以下技术:

VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

这是因为“验证错误”将 ERRORLEVEL 设置为 1,然后如果扩展不可用(例如,如果脚本在 command.com 下运行),SETLOCAL 将无法重置 ERRORLEVEL 值

如果命令扩展被永久禁用,则 SETLOCAL ENABLEEXTENSIONS 将不会恢复它们。

于 2008-11-07T01:46:49.740 回答
0

是否该文件没有扩展名,因此 cmd 将其视为不存在的目录?

于 2008-11-04T14:20:03.187 回答
0

如果禁用命令扩展,则 for 命令的 (set) 参数必须是文件。

如果启用了命令扩展,则 for 命令的 (set) 参数可以是文件、字符串或命令。

在“类型文件名”设置失败的客户端计算机上禁用命令扩展。

有关启用或禁用命令扩展的信息,请键入“cmd /?”

于 2008-11-04T14:30:22.620 回答
0

等等...可能是文件名周围有撇号吗?MS是说文件名集有双引号,而文字字符串有撇号。

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]

当然,除非你这样做。

您可以在立即字符串上使用 for /F 解析逻辑,方法是将括号之间的文件名集括在单引号中(即“文件名集”)。Filenameset 被视为来自文件的单行输入,然后对其进行解析。

于 2008-11-04T17:26:02.263 回答