【问题标题】:Odd limitation on pipes in batfile on XPXP上bat文件中管道的奇怪限制
【发布时间】:2012-12-27 15:38:12
【问题描述】:

我在 XP Pro SP3 系统上创建的 BAT 文件每次都能完美运行。
安装在另一个 XP [也是 Pro SP3] 系统上,它每次都会失败(“挂断”)。

问题出在多步管道中。 为了隔离它,我一直在简化,直到找到这个最小的 [和人工的] 测试用例

echo. | date | find "/" | find "/" | find "/"

注意:前两个步骤没有缩短为date /t,因为一些用户的系统是XP之前的[因此缺少命令扩展]。另外:仔细测试表明date 正在执行 MS-DOS 内部的DATE 命令,find 正在执行原版“FIND.EXE, Aug 4 2004, 9216” "C:\WINDOWS\system32\" [和 "C:\i386\" 中的安全副本相同]。

在失败的系统上,每一个具有 4 或更多 |s 的命令都会在第五步中挂起,即使 - 就像这里一样 - 程序很简单并且它们正在处理的文本量是微不足道的。

我昨天在用户系统上做了一些进一步的测试,发现了一个我不知道的微妙之处。我在命令提示符处输入了简化的命令 [上图]。正如预期的那样,它失败了[“挂起”]。然而,当我重新启动并在做任何其他事情之前再次尝试时[这种情况在用户的正常操作中永远不会发生],我感到震惊:它起作用了[即 MS-DOS DATE 命令的输出按预期出现]。它再次起作用了。然后在第三次尝试时,故障模式再次出现,此后一直保持一致。
我确认files=40 对两个系统都有效,然后放弃了。我仍然很好奇,但我不能在一个公益客户的小项目上花费大量时间来分析我可以轻松解决的问题。
感谢大家快速而有用的回复。

在原始系统上,具有 4 个或更多 |s 的命令可以正常工作,无论调用了哪些程序以及它们正在处理多少文本 [在合理范围内]。

一旦识别出限制,就有许多微不足道的解决方法,所以我的问题只是出于好奇:谁能建议限制来自哪里以及 [XP 中] 是否存在会提高/消除它的设置?

注意:这两个系统上均不存在 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun 和 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun。

另外:我很抱歉通过反复编辑我的原始帖子来回答 cmets,但无论我使用哪个浏览器登录,“添加 cmets”弹出窗口 [或任何它应该是的] 都不会出现。也许我的理解是,在我自己的帖子中添加评论不需要声誉点数是错误的。但是,现在我看到“显示 # 更多 cmets”也不起作用。

最后:我在使用这个网站时遇到的问题 [主要症状是 javascript 控制台消息“未捕获的 ReferenceError: StackExchange 未定义”] 与大约一年前在 https://meta.stackexchange.com/questions/117730/stack-overflow-onclick-actions-broken 讨论的问题相同。

【问题讨论】:

  • 管道的每一侧都通过一个新的 CMD.EXE 进程执行。任何一台机器的注册表中是否都有可能导致问题的 AutoRun 条目? (HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRunHKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
  • 我可能有点不精确。我向你保证,每一方都是通过cmd 异步执行的,但它可能是通过一个新线程而不是一个新进程。有关更多信息,请参阅Why does delayed expansion fail when inside a piped block of code? 的已接受答案。此外,cmd AutoRun 命令将在已定义的情况下运行。我不知道 AutoRun 会如何导致您的问题,但可能值得调查。
  • @mrt "请注意,您可以随时评论自己的帖子以及您的任何问题。"
  • 一些想法...在故障系统的某处是否有一个名为 DATE.BATDATE.CMDFIND.BATFIND.CMD 的批处理文件?两个系统上的系统日期格式是否相同?
  • 您可以通过使用date /t来简化命令并消除echo

标签: batch-file windows-xp dos


【解决方案1】:

使用 ^ 避免特殊字符
例子 回声。 ^|日期^|找到“/”^|找到“/”^|找到“/”

http://www.robvanderwoude.com/escapechars.php

【讨论】:

    【解决方案2】:

    有时,如果注册表中缺少某些内容,您必须手动添加它才能使其正常工作。或者,获取一些高级 windows BAT 编辑器,这将扩展您的批处理脚本的可能性,使其超出标准 windows 命令等。为此,他们通常将您的批处理文件附加并转换为 exe ,因为可执行文件是扩展功能的引擎。它们中的大多数是共享软件,但是,请注意它们的规范,在这种情况下,您所需要的只是带有引擎的简单编辑器,它将批处理文件提取到临时目录并执行它。您可能不需要用于混淆您的批处理文件的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2011-09-25
      • 2019-08-27
      • 2021-04-28
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多