gpt4 book ai didi

c++ - 如何在没有窗口的情况下在 C++ 中调用 powershell

转载 作者:行者123 更新时间:2023-11-30 05:30:15 24 4
gpt4 key购买 nike

我正在使用它来调用 powershell,但即使我使用 CREATE_NO_WINDOW,此代码也是来 self 之前的 system() 调用的 C&P。但它不起作用。更新的代码(仍然无法正常工作):

LPWSTR PSPath = env(_TEXT("SystemRoot"));
LPWSTR TEMP2 = env(_TEXT("TEMP"));
LPWSTR HOMEDRIVE = env(_TEXT("HOMEDRIVE"));
LPWSTR PSPathexe = (_TEXT("%s\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -Executionpolicy bypass -File \"%s\\psscript.ps1\" -Filename psscript -Folderpath \"%s\\deployment\""),PSPath,TEMP2, HOMEDRIVE);
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

CreateProcess(NULL, PSPathexe, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

最佳答案

先行

LPWSTR command=(_TEXT("powershell.exe -Executionpolicy bypass -File \"%deploy%\\psscript.ps1\" -Filename psscript -Folderpath \"%HOMEDRIVE%\\deployment\""));

……存在三个严重的问题:

  • LPWSTR是扩展为 wchar_t* 的 Microsoft 宏,而初始化程序减少到文字,这是一个数组 const人物。此删除 const已在 C++98(第一个 C++ 标准)中弃用,并在 C++11 中被删除——现在无效

  • _TEXT是一个 Microsoft 宏,它添加了一个前缀 L如果宏符号 _UNICODE 到字面量被定义为。它曾经是提供与 Windows 95 兼容性的计划的一部分,直到 Unicode 层在 2000 年被引入。我们现在 16 年后这已经过时,最重要的是,您将如果你不定义 _UNICODE 就会出现编译错误,因为您没有按要求在所有地方使用该方案。

  • %HOMEDRIVE%字符串中是用于扩展环境变量的命令解释器语法。我不是 100% 确定,只有 99.8% 左右,但据我所知CreateProcess没有那个功能。

类型问题(第一个要点)可以通过使用本地数组来解决,例如

wchar_t command[] = L"notepad.exe";

请注意 CreateProcess要求这是可写的。因此,即使使用接受原始声明的编译器,您也会在未定义的行为 土地上离开,代码可能会尝试修改文字。

环境变量问题可以通过在构造命令字符串之前扩展该变量来解决。为此,我会使用 std::wstring .它有助于连接等。


然后,调用

CreateProcess(NULL, command, NULL, NULL, NULL, CREATE_NO_WINDOW, NULL, NULL, NULL, NULL);

…提供NULL对于返回进程和线程句柄的参数,以及指定启动信息的参数。那是行不通的。阅读文档。


提示:

  1. 如果您尝试 CreateProcess考虑一些更简单的任务,例如运行记事本,您可以轻松学习如何正确调用它。

  2. 您可能会找到 ShellExecuteShellExecuteEx比基本的更好 CreateProcess (免责声明:我没有检查它们是否支持无窗口执行,但很可能支持)。

关于c++ - 如何在没有窗口的情况下在 C++ 中调用 powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043193/

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