&1 | findstr foo echo done calling test2 :: te-6ren">
gpt4 book ai didi

windows - "start"命令在子进程中不继承句柄如何使用?

转载 作者:可可西里 更新时间:2023-11-01 13:40:14 26 4
gpt4 key购买 nike

这是说明我的问题的最小示例:

:: test.bat
@echo off
call test2.bat 2>&1 | findstr foo
echo done calling test2

:: test2.bat
@echo off
start /B notepad >NUL
echo done starting child process

在这个例子中,findstr 直到记事本关闭才会完成,大概是因为记事本从父 cmd 进程继承了 stdout。如何修改 test2.bat 以使 test.bat 不挂起?

最佳答案

我相信我可以在没有任何批处理文件的情况下说明问题。在关闭 notepad.exe 之前,以下管道构造不会完成:

start notepad | findstr "^"

我希望记事本将在一个与 cmd.exe 管道完全分离的新进程中执行,唯一被管道传输的是 START 命令本身的输出(没有)。 START 命令“立即”返回,但只要记事本正在运行,管道就会保持打开状态。

我不知道是否是继承的 I/O 流使管道保持打开状态,但我可以证明记事本进程正在以可能是问题根源的方式继承流。这基本上与在 Issue with output redirection in batch 提出的问题相同.

这是一个简单的批处理脚本:test.bat

@echo off
call :test >nul
echo done calling test.bat
exit /b

:test
start notepad

请注意,由于 call :test >nul 的重定向,当记事本启动时,stdout 已被重定向到 NUL。

现在看看当我从命令行发出一系列命令时会发生什么,首先是将 stdout 重定向到文件的 test.bat:

C:\test>test.bat >test.txt

C:\test>REM The command returns immediately, and notepad remains open

C:\test>type test.txt
done calling test.bat

C:\test>echo This fails as long as notepad remains open >test.txt
The process cannot access the file because it is being used by another process.

C:\test>type test.txt
done calling test.bat

C:\test>REM Now I close notepad

C:\test>echo This works once notepad is closed >test.txt

C:\test>type test.txt
This works once notepad is closed

C:\test>

我仍然对这种行为感到震惊。这似乎完全不合逻辑。

我不认为有任何方法可以阻止 cmd.exe 的流继承。

也许 Harry Johnston 的建议可以解决这个问题(来自问题评论):“我会编写一个非常简单的可执行文件来调用禁用继承的 CreateProcess。”

关于windows - "start"命令在子进程中不继承句柄如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com