首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用ShellExecuteEx并捕获标准输入/输出/错误

作为一个云计算领域的专家,我可以告诉你,使用ShellExecuteEx并捕获标准输入/输出/错误是一种在Windows操作系统中执行外部程序的方法。ShellExecuteEx是一个Windows API函数,它允许你以异步方式执行外部程序,并且可以捕获该程序的标准输入/输出/错误流。

在使用ShellExecuteEx时,你需要提供一个完整的命令行,包括可执行文件的路径和参数。你还可以指定一个STARTUPINFO结构体,该结构体包含了一些与新进程相关的信息,例如新进程的工作目录和环境变量。ShellExecuteEx函数将返回一个PROCESS_INFORMATION结构体,该结构体包含了新进程的一些信息,例如进程ID和主线程ID。

要捕获标准输入/输出/错误流,你需要使用CreatePipe函数创建一个管道,并将其与新进程的标准输入/输出/错误流关联。你可以使用ReadFile和WriteFile函数读取和写入管道中的数据。

以下是使用ShellExecuteEx并捕获标准输入/输出/错误流的一个示例代码:

代码语言:c++
复制
#include<Windows.h>
#include<iostream>

int main()
{
    // 创建管道
    HANDLE hReadPipe, hWritePipe;
    SECURITY_ATTRIBUTES sa = {sizeof(sa), NULL, TRUE};
    CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);

    // 设置STARTUPINFO结构体
    STARTUPINFO si = {sizeof(si)};
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdInput = hReadPipe;
    si.hStdOutput = hWritePipe;
    si.hStdError = hWritePipe;
    si.wShowWindow = SW_HIDE;

    // 调用ShellExecuteEx函数
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    ShellExecuteEx(&pi, NULL, "cmd.exe", "/c dir", NULL, SW_HIDE, &si);

    // 读取输出数据
    char buffer[4096];
    DWORD bytesRead;
    while (ReadFile(hReadPipe, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0)
    {
        std::cout.write(buffer, bytesRead);
    }

    // 等待进程结束
    WaitForSingleObject(pi.hProcess, INFINITE);

    // 关闭句柄
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);

    return 0;
}

在这个示例中,我们使用ShellExecuteEx函数启动一个命令提示符窗口,并执行“dir”命令。我们将标准输入/输出/错误流都重定向到一个管道中,并使用ReadFile函数读取管道中的数据。最后,我们等待进程结束,并关闭所有句柄。

需要注意的是,使用ShellExecuteEx函数启动外部程序可能存在安全风险,因此应该谨慎使用。此外,如果你需要执行的外部程序是一个GUI程序,那么你需要使用其他方法来启动它,例如使用CreateProcess函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Shell标准输入标准输出标准错误的重定向总结

shell脚本只使用标准输入标准输出标准错误 Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。...标准输入是命令的输入,默认指向键盘; 标准输出是命令的输出,默认指向屏幕; 标准错误是命令错误信息的输出,默认指向屏幕。...但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。...把标准输出重定向到filename2文件中 command 0 filename2 把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中 重定向的使用有如下规律...: 1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。

2.9K20

Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法

1.标准输入input()、raw_input()Python 3.x 中 input() 函数可以实现提示输入,python 2.x 中要使用 raw_input(),例如:foo = input("...sys.stdin 可以获取标准输入的文件句柄对象,例如:import sysprint("Enter a line: ")line = sys.stdin.readline() # 读取一行...linelast line] <======== 最后一行也有换行符2.标准输出printprint 可以自动换行,例如:print("%s is %0.2f...sys.stdout 可以获取标准输出的文件句柄对象,例如:import syssys.stdout.write("%s is %0.2f, %d is a integer\n" % ("PI", 3.14...(注:write()不会自动换行,这里加了换行符)3.标准错误sys.stdout使用 sys.stderr 可以获取标准错误的文件句柄对象,示例略(将 sys.stdout 中示例中的 stdout

28110

FileDescriptor文件描述符 标准输入输出错误 文件描述符

FileDescriptor  这是java层面的描述 具体的值是 0  1   2  ,这是操作系统层面的描述 在linux 中, 每个进程启动时都打开3个文件(linux 中一切都是文件):  * 标准输入...  0 * 标准输出  1 * 标准错误  2 三个描述符,通过调用私有方法 standardStream进行创建初始化 创建一个FileDescriptor 并且,设置他的...handle值 内部的set(fd)是一个本地方法 说白了,就是通过调用本地方法,获得操作系统对标准输入/输出/错误的三个文件描述符 ?...注释中也说的很清楚,文件描述符一般不直接使用通过使用System.in  System.out System.err 文件描述符在System类中的应用 在System 中   in  out err...  都是 final  static的 标准输入输出是共享,但是java是多线程的 因此它们必须受到特别的处理,在系统初始化完成之前,线程严禁使用这几个特殊对象; 又因为这些对象都是静态的

1.7K20

K8S学习笔记之使用Fluent-bit将容器标准输入输出的日志发送到Kafka

0x00 概述 K8S内部署微服务后,对应的日志方案是不落地方案,即微服务的日志不挂在到本地数据卷,所有的微服务日志都采用标准输入输出的方式(stdin/stdout/stderr)存放到管道内,容器日志采用的是...目前大部分K8S容器日志都采用Fluent或者Fluent-bit,将日志传输到ES集群,本文主要讲使用Fluent-bit将容器的日志传输到Kafka。...0x01 部署Fluent-bit传输到Kafka 详细请看https://github.com/fluent/fluent-bit-kubernetes-logging 1.1 创建Fluent-bit...Daemonset使用的configmap $ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging...raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-ds.yaml 0x02 Fluent-bit输出方向

2.1K30

WinExec、ShellExecute和CreateProcess

CreateProcess因为使用复杂,比较少用。 WinExec主要运行EXE文件。   ...当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。..., GetLastError()不一定能捕获错误代码,例如当“d:\\tese.log”文件存在,将记事本”notepad.exe”命名为其他名字时:   另外两个函数的返回值就不列出了。...2、特殊用法   1)如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器链接到指定的URL地址。...可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入输出。新程序通常可以忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明要设置的数据段。

94120

python模块之subprocess类与常量

常量 subprocess.DEVNULL:可传递给stdin, stdout, stderr参数的特殊值,意味着将使用特殊文件os.devnull重定向输入输出 subprocess.PIPE:可传递给...stdin, stdout, stderr参数的特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数的特殊值,表示重定向标准错误标准输出 Popen 在一个新的进程中执行子程序...stdin/stdout/stderr:分别指定程序执行的标准输入标准输出标准错误。可选值包括PIPE,DEVNULL,已存在的文件描述符(正整数),已存在的文件对象,None。...除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于子进程中的程序执行。...如果未捕获标准输出返回None stderr:捕获的子进程的标准错误,默认为byte类型,如果run()函数调用时指定了encoding或errors,或设置了text=True则为string类型。

2.4K10

Python中os.system()、subprocess.run()、call()、check_output()的用法

subprocess.STDOUT: 用作 stderr 参数的值时,相当于把标准错误重定向到标准输入中) subprocess.DEVNULL: 用作 stdout, stderr 参数的值时,...True 了,可以通过返回值对象访问标准输出标准错误内容shell: 当设置为 True 时,args 参数会当做一条命令字符串(支持管道、重定向操作);当它为 False 时,args 需是一个列表.../bin/sh 的输出错误 # 当 shell=False 时,是要去捕获 "abcdefg" 命令自身输出的内容,但是它不存在,python 会报错 stdout=subprocess.PIPE...,也可以将设置 stderr=subprocess.STDOUT 将标准错误重定向到标准输出,但是好像没有办法单独捕获标准错误内容呢!...run-child"] ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT) print("[" + ret + "]") # 输出内容中包含标准输出标准错误

53420

BI错误处理。

在这种情况下,目标是创建新的 最终费率 列,该列将使用 标准费率 列中的值。 如果有任何错误,则它将使用“ 特率” 列中的值。...上面的公式将尝试评估 标准速率 列,并在未找到错误输出其值。 如果在 “标准速率 ”列中找到错误,则输出将是在语句之后 otherwise 定义的值,在本例中为 “特殊速率 ”列。...这是你将创建新的自定义列使用 try 表达式的位置。与自定义逻辑配合使用try若要创建新的自定义列,请转到 “添加列 ”菜单,然后选择“ 自定义”列。...表达式 try 将值和错误转换为记录值,该值指示表达式是否 try 处理错误,以及正确的值或错误记录。可以使用记录值展开此新创建的列,通过选择列标题旁边的图标来查看要展开的可用字段。...现在,使用新列中的每条错误消息,可以使用名称 “最终速率 ”和以下子句创建新的条件列:如果 “所有 Errors.Errors.Message ”列中的值相等 null,则输出将是 标准速率 列中的值。

2.7K30

Python 异常处理总结

Python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception...断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败...使用except而不带任何异常类型 你可以不带任何异常类型使用except,如下实例: ? 以上方式try-except语句捕获所有发生的异常。...因为它捕获所有的异常。 使用except而带多种异常类型 你也可以使用相同的except语句来处理多个异常信息,如下所示: ?...finally块中的所有语句执行后,异常被再次提出,执行except块代码。参数的内容不同于异常。 异常的参数 一个异常可以带上参数,可作为输出的异常信息参数。

1.1K60

关于Python异常处理,你需要了解的知识点

这时候,就需要捕获处理它,否则程序会终止执行。 异常处理 使用try/except/finally语句进行捕获操作,告诉Python发生异常时如何处理。...异常/错误 as 别名,使用别名接收异常对象的错误信息。...如何捕获多个异常? 1.写出多行except 异常/错误,指定捕获多个不同类型的异常。2.使用 except (异常1,异常2..),使用元组,在一行中捕获多个不同类型的异常。...Python标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception...断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败

1.4K61

使用Python捕获和处理异常日志

当我们的程序运行时发生错误或异常,及时捕获记录异常日志可以帮助我们快速定位和解决问题,提升程序的稳定性和可靠性。...本文将介绍如何使用Python来捕获和处理异常日志,帮助读者更好地理解和应用异常处理的技术。...例如,我们写一段除法的程序,输入被除数除数,输出打印,代码如下: def Get_quotient(): a=input("请输入被除数") b=input('请输入除数')...Python标准库提供了logging模块,让我们也可以方便的在Python中打印日志。...通过Python的异常处理机制,我们可以捕获和处理程序运行过程中的异常情况,记录相关的日志信息,帮助定位和解决问题。希望本文可以帮到大家!

6210

【笔记】《C++Primer》—— 第10章:泛型算法

比较默认是使用<或==实现的,有时候默认的运算符实现并不适合我们,可以通过在参数输入新的可调用对象(如函数)来自定义默认行为,这个参数称为“谓词” 谓词是一个可调用的表达式,标准库中的谓词分接受一个参数的一元谓词和接受两个参数的二元谓词...vec3, vec3.begin())); 注意对插入迭代器进行++,--是无意义的,只是为了统一通用而存在 流迭代器有两种类型,istream_iterator和ostream_iterator,它们使用输入输出运算符来处理流...,递增移动,解引用(处于右侧) 输出迭代器用于对元素进行改变,相当于输入迭代器的补集,注意我们只能对一个输出迭代器赋值一次,需要支持:递增移动,解引用(处于左侧) 前向迭代器可以顺序读写元素,我们可以对此迭代器进行保存和多次使用...随机访问迭代器提供在常量时间内访问序列中任意元素的能力,同时支持了:比较迭代器之间位置的运算,迭代器与一个整数的位置加减运算,下标运算 知道了迭代器的分类后就可想而知算法大概会需要什么迭代器才能运行(迭代器错误时会报错产生相应的错误提示...,这些函数通常来说性能比标准库的通用函数更好,应尽可能使用 ?

63320

Linux 温习(九): IO 重定向与进程管道

0 表示标准输入,可以理解为键盘输入;1 表示标准输出输出到终端;2 表示标准错误输出到终端;3 及以上为常规文件描述符; 1,2可理解为执行命令时输出的结果,包括失败和成功;这么说可能看不明白,演示几个例子就知道了...tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。...在使用管道时,前一个命令的标准错误不会被 tee 读取 使用范例 范例 1: ps 命令结果通过管道给 grep 匹配 > ps -ef |grep php root 1451...free命令显示系统内存使用信息,使用tee命令将信息输出到屏幕,保存到文件mem.txt中 > free -h | tee mem.txt total used...tee 捕获错误(无法捕获) > ls /home/linux >list.txt 2>&1 > ls /home/linux 2>&1 | tee list.txt ls: cannot access

1.1K20

python的异常处理

python标准异常异常名称描述BaseException所有异常的基类SystemExit解释器请求退出KeyboardInterrupt用户中断执行(通常是输入^C)Exception常规错误的基类...对象没有这个属性EOFError没有内建输入,到达EOF 标记EnvironmentError操作系统错误的基类IOError输入/输出操作失败OSError操作系统错误WindowsError系统调用失败...异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。----异常处理捕捉异常可以使用try/except语句。...try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。如果你不想在异常发生时结束你的程序,只需在try里捕获它。...finally块中的所有语句执行后,异常被再次触发,执行except块代码。参数的内容不同于异常。----异常的参数一个异常可以带上参数,可作为输出的异常信息参数。

1K40

subprocess:Python中创建子进程

这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入输出通道来回传数据。 本篇,将详细介绍Python创建附加进行的库:subprocess。...对于run()函数启动的进程,它的标准输入输出通道会绑定到父进程的输入输出。这说明调用程序无法捕获命令的输出。不过,我们可以通过为stdout和stderr参数传入PIPE来捕获输出,以备以后处理。...通过Shell返回消息 本例会通过一个子shell运行命令,在命令返回错误退出之前,将详细输入到控制台。...直接使用Popen可以更好的控制如何运行命令以及如何处理输入输出流。Popen的构造函数利用参数建立新进程,使父进程可以通过管道与之通信。 下面,我们来分别介绍进程间通信的方式。...与进程的单项通信 要运行一个进程读取它的所有输出,可以设置stdout为PIPE调用communicate()函数。

41470
领券