Windows 需要运行.exe文件7秒钟,然后在文本文件中执行输入和输出时终止exe

Windows 需要运行.exe文件7秒钟,然后在文本文件中执行输入和输出时终止exe,windows,batch-file,cmd,Windows,Batch File,Cmd,我想创建一个批处理文件,它运行一个程序7秒钟,而不管另一个程序的执行是否完成。我还希望程序应该接受输入并将输出保存在外部文件中。这就是我所尝试的: start program.exe ping 1.1.1.1 -n 1 -w 7000 > nul taskkill /im program.exe /f rem continue here 上面的操作很好,但当我将第1行替换为: start program.exe < in.txt > out.txt start progra

我想创建一个批处理文件,它运行一个程序7秒钟,而不管另一个程序的执行是否完成。我还希望程序应该接受输入并将输出保存在外部文件中。这就是我所尝试的:

start program.exe
ping 1.1.1.1 -n 1 -w 7000 > nul
taskkill /im program.exe /f
rem continue here
上面的操作很好,但当我将第1行替换为:

start program.exe < in.txt > out.txt
start program.exeout.txt

然后文件中的输入和文件中的输出不起作用。

cmd不设置
CreateProcess
STARTUPINFO
结构的
STARTF\u USESTDHANDLES
标志。相反,它临时重定向自己的标准句柄并依赖继承。即使cmd必须调用
ShellExecuteEx
,这种方法也可以工作,因为它缺少显式设置标准句柄的方法

但是,如果在进程创建标志中设置了
CREATE\u NEW\u CONSOLE
,则重定向其自身的标准句柄不起作用,这是
start
命令的默认设置。要避免此问题,请使用
/b
选项防止创建新控制台

您可能还希望将stderr重定向到stdout或文件。这样可以防止将错误写入控制台。例如:

  • start/b program.exe out.txt 2>&1
  • start/b program.exe out.txt 2>err.txt
  • start/b program.exe out.txt 2>nul

示例使用

(测试)C:\>cdb-Goxi ld cmd
Microsoft(R)Windows调试器版本6.12.0002.633 AMD64
版权所有(c)微软公司。版权所有。
命令行:cmd
符号搜索路径为:symsrv*symsrv.dll*
C:\符号*http://msdl.microsoft.com/download/symbols
可执行搜索路径为:
(ed0.1770):中断指令异常-代码8000003(首次机会)
ntdll!LdrpDoDebuggerBreak+0x30:
00000000`77848700 cc内部3
0:000>。重新加载/f
重新加载电流模块
.....
0:000>bp CreateProcessW
0:000>g
在新控制台中运行where.exe

Microsoft Windows[版本6.1.7601]
版权所有(c)2009微软公司。版权所有。
(测试)C:\>启动/w where.exe nul
断点0命中
内核32!CreateProcessW:
00000000`775a0660 4883ec68子rsp,68h
请注意,cmd.exe在调用
CreateProcess
之前重定向其
StandardOutput

0:000>??((ntdll!\u PEB*)@$PEB)->过程参数->标准输出
无效*0x00000000`00000060
0:000> !处理60 3
处理60
类型文件
属性0
授权访问0x120196:
读控制,同步
Write/Add、Append/SubDir/CreatePipe、WriteEA、ReadAttr、WriteAttr
HandleCount 2
指针计数3
进程创建标志,即
dwCreationFlags
,第六个参数:

0:000>dd(@rsp+6*8)l1
00000000`00182c58 00080410
作为0x80410传递,0x80410是以下标志的按位OR:

  • EXTENDED\u STARTUPINFO\u PRESENT
  • 创建UNICODE\u环境
  • 创建新控制台
由于创建了新控制台,其中.exe不会继承cmd的标准句柄:

0:000>g
符号搜索路径为:symsrv*symsrv.dll*
C:\符号*http://msdl.microsoft.com/download/symbols
可执行搜索路径为:
(1550.1a80):中断指令异常-代码8000003(第一次机会)
ntdll!LdrpDoDebuggerBreak+0x30:
00000000`77848700 cc内部3
1:001> ?? ((ntdll!\u PEB*)@$PEB)->过程参数->标准输出
无效*0x00000000`0000000 7
注意:在Windows8+中,控制台句柄只是一个常规的文件句柄,因此您必须深入研究

我在本例中使用的是Windows 7,因此控制台句柄是通过设置较低的2位(例如3、7、11=>0b0011、0b0111、0b1011)标记的假句柄。所谓“假”是指它们不在用于内核对象句柄的进程句柄表中。因此,例如,您不能使用调试器
!手柄
检查手柄7的命令:

1:001>!手柄7 f
无法复制句柄7,错误87
在Windows 7中,控制台句柄由控制台主机进程conhost.exe分配和管理。它们已标记,因此Windows基本函数可以通过
NtRequestWaitReplyPort
对conhost.exe进行所需的LPC调用


上面的示例演示了创建新控制台如何覆盖继承cmd的重定向标准句柄。现在,让我们添加
/b
选项以防止创建新控制台

1:001>g
(测试)C:\>启动/b/w where.exe nul
断点0命中
内核32!CreateProcessW:
00000000`775a0660 4883ec68子rsp,68h
dwCreationFlags
为0x80600:

0:000>dd(@rsp+6*8)l1
00000000`00182c58 00080600
以下创建标志中的哪一个是按位或:

  • EXTENDED\u STARTUPINFO\u PRESENT
  • 创建UNICODE\u环境
  • 创建新流程组
(指定
/b
的一个副作用是将流程创建为新流程组的负责人。如果是控制台流程,则允许生成针对该组的Ctrl+Break事件。)

在这种情况下,where.exe从cmd.exe继承重定向的标准句柄:

0:000>g
符号搜索路径为:symsrv*symsrv.dll*
C:\符号*http://msdl.microsoft.com/download/symbols
可执行搜索路径为:
(1508.1534):中断指令异常-代码8000003(第一次机会)
ntdll!LdrpDoDebuggerBreak+0x30:
00000000`77848700 cc内部3
1:001> ?? ((ntdll!\u PEB*)@$PEB)->过程参数->标准输出
无效*0x00000000`00000064
1:001> !处理64 3
处理64
类型文件
属性0
授权访问0x120196:
读控制,同步
Write/Add、Append/SubDir/CreatePipe、WriteEA、ReadAttr、WriteAttr
手算3
指针计数4