如何创建一个新窗口并在powershell中设置UseShellExecute false?

问题描述 投票:1回答:1

这个要求有点奇怪,我在powershell的多线程中遇到了一个奇怪的问题。所以我想创建一个新窗口,不要使用shell Execute。但我无法使用下面的代码,窗口不显示。 $ approot是桌面,在start.bat中,只需执行“dir / s。\”我希望dir结果显示在另一个窗口而不是窗口执行此脚本,我不想使用shell执行。

$startInfo = New-Object system.Diagnostics.ProcessStartInfo
$startInfo.UseShellExecute = $false
$startinfo.FileName = $env:ComSpec
$startInfo.CreateNoWindow = $false
$startInfo.Arguments = "/c cd /d $AppRoot & call start.bat"
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
$process.Start() | Out-Null
.net powershell
1个回答
2
投票

如果将.UseShellExecute设置为$False,则无法在新窗口中启动命令; .CreateNoNewWindow实际上被忽略了。

因此,您也可以使用Start-Process,它将.UseShellExecute保留为默认值$True [1]。

Start-Process $env:ComSpec -Args '/k', "cd /d `"$AppRoot`" & call start.bat"

为了促进良好的习惯,$AppRoot被包含在嵌入式双引号中(逃避为`")以正确处理包含空格的路径。虽然这对于cmd.execd来说并不是绝对必要的,但几乎所有其他命令/程序都是如此。

请注意,我使用/k而不是/c作为cmd.exe$env:ComSpec)开关,以确保新窗口保持打开状态。


如果必须将.UseShellExecute设置为$False,请使用conhost.exe显式创建一个新窗口(需要Windows 10):

$process = New-Object System.Diagnostics.Process
$process.startInfo.UseShellExecute = $false
$process.startinfo.FileName = 'conhost.exe'
$process.startInfo.Arguments = "cmd /k cd /d `"$AppRoot`" & call start.bat"
$null = $process.Start()

在Windows的其他版本/版本上,您可以使用P / Invoke直接使用CreateProcess() Windows API function调用CREATE_NEW_CONSOLE flag


[1] *请注意,某些Start-Process参数,例如-NoNewWindow-Credential,要求将.UseShellExecute设置为$False,在这种情况下,在幕后使用CreateProcess() WinAPI函数(而不是ShellExecute())。 *另请注意,在.NET Core中,默认值为$False,但PowerShell Core的Start-Process仍然默认为$True以匹配Windows PowerShell的行为。

© www.soinside.com 2019 - 2024. All rights reserved.