【问题标题】:START /B with php/node/python script doesn't work as expected带有 php/node/python 脚本的 START /B 无法按预期工作
【发布时间】:2016-03-11 13:20:54
【问题描述】:

我启动一个 shell 并运行以下命令:

START "" /B php test.php>nul 2>&1

就本文而言,test.php 包含 1 行:file_put_contents("test", "test");

您希望它会立即创建一个名为 test 的文件,但事实并非如此。 相反,当我输入命令并按回车键时,什么也没有发生。但是,在同一个命令窗口中,如果我再次按下回车键,脚本就会运行。

我已经尝试了 node、python2 和 python3 的等效命令。它们都做同样的事情,尽管 python3 非常奇怪地需要在脚本运行之前按下 2 次回车键。

当使用脚本解释器运行 START /B 时,这似乎是一个怪癖。如果我使用 .exe 或 .bat 运行 START /B,那么它会按预期运行。

现在,显然我不需要运行创建名为“test”的文件的后台进程。我需要它做的是在同一个终端一个接一个地启动一个用php编写的守护进程和一个用nodejs编写的守护进程。

我还注意到,如果我将这些命令写入批处理文件并通过双击批处理文件而不是从 shell 调用它来运行它们,那么它会按预期运行。

请帮忙。我已经为这个问题苦苦挣扎了 2 天了。

编辑:

我刚刚发现这个问题是我在 Windows 10 上运行的计算机所独有的。我在 Windows 7 和 Windows XP 上进行了尝试,它们不需要我额外的返回输入来运行脚本...

我刚刚尝试在安全模式下启动并清除我的路径变量。它仍然存在。 我想知道这是否是 Windows 10 的错误/功能? 我该如何诊断和解决这个问题?

编辑 2:

刚刚在 Windows 8 机器上测试了相同的脚本,它出乎意料地与我的 Windows 10 机器完全一样。所以看起来只有 Windows 8 和 Windows 10 有这个问题......并且使用传统模式没有区别。 什么 FFFFFFFFFnnngggghhhrrr... 我在任何地方都找不到任何人报告这个问题。

这是一个 gif 动画,说明了具体发生了什么:

证明该脚本仅在第二次按下返回键时运行。

【问题讨论】:

  • 去掉>nul 2>&1会怎样?
  • 肯定和>nul 2>&1有关。我认为第一个 >nul 没有正确转义
  • 不,试过了。尝试自己直接将其输入控制台,您应该会遇到同样的异常行为:START "" /B php test.php>nul 2>&1 won't run on the first return.
  • 我已经修改了我的帖子,看起来它对我来说是独一无二的,但仍然没有接近修复它...请帮助我。
  • 好的,刚刚意识到问题不是我独有的,而是 Windows 8 和 10 操作系统的问题。完全糊涂了……

标签: php windows shell batch-file command-line


【解决方案1】:

我遇到了非常相似的问题,并在尝试寻找答案时偶然发现了这个 SO 问题。

在我的例子中,我尝试使用“popen”从 PHP 运行 windows 命令。
我最近从 8 升级了 Wampserver 和 Windows 10。
我的代码在升级之前工作,随后超时。
我在命令行上也发现了同样的问题——必须输入换行符才能接收输出。

我的解决方案有两个:
1. 在命令行中,我发现添加 '/wait' 开关解决了这个问题。
2. PHP 使用的 shell 与 cmd shell 的 PATH 不同。我的 php.exe 路径被定义了两次,我的旧版本 Wampserver 有一个旧条目。所以我删除了它。请注意,我必须重新启动 PC 才能正确更新路径。

【讨论】:

    【解决方案2】:

    您可以尝试<NUL 向命令发送额外的Enter。

    start "" /b php test.php <NUL
    

    Re:为什么会发生这种情况,抱歉,我无法回答那部分。漏洞?安全?未记录的功能? *耸耸肩*

    【讨论】:

    • 恐怕这和以前完全一样。仍然需要我在以下空命令上按回车
    • @hedgehog90 查看我的编辑。我们会反复试验这件事。 :)
    • 我刚刚给了你 50 个代表点,我怀疑我们会在不直接询问 Microsoft 的情况下弄清原因。感谢您的帮助:)
    【解决方案3】:

    我在这里看不到任何问题。
    也许您的某些测试损坏了您的 cmd.exe。
    对于测试,我打开了一个新的 cmd 窗口

    我测试过

    test.php

    <?php
    echo "Hello";
    ?>
    

    和

    start "myTitle" /b php test.php
    

    【讨论】:

    • 您正在运行哪个操作系统?我只在 Windows 8 和 10 上遇到问题
    【解决方案4】:

    start /b 启动另一个进程,该进程与原始 Windows 共享输入和输出。 (验证做start /b "" prompt $G并反复按回车)

    最好在另一个 Windows 中启动辅助进程(不使用 /b - 使用 /min 代替以最小化运行它)。您还应该给它一个Exit,否则它会保持打开状态:

    start /min "" echo hello^>hello.txt^&Exit
    

    注意:如果您不转义 &gt;、&amp;、| 等特殊字符,它们将由“开始”处理 - 换句话说,在您的原始上下文中,而不是在新启动的进程。

    【讨论】:

    • 问题是我真正想要运行的 php 脚本是一个套接字侦听器,额外的 CMD 窗口需要保持打开状态。我想我在我的 OP 中说过我还需要一个节点脚本的实例来运行,这样总共会产生 3 个 CMD 窗口。
    • 好吧,然后忘记exit。关键是在它自己的窗口中运行脚本 - 没有“共享输入”(我没有 php,但我很确定这不是问题。这是“共享输入”有效 - 好 - 奇怪)
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2015-06-23
    • 2021-11-03
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多