gpt4 book ai didi

windows - 使用 Start-Process 时禁止打开命令窗口

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

我正在尝试找到一种方法,让 PowerShell 在使用 Start-Process 运行可执行文件时不生成命令窗口。

如果我直接在脚本中调用可执行文件(例如 .\program.exe),程序就会运行(带有参数)并且输出会返回到 PowerShell 窗口。

如果我使用 Start-Process,程序会生成一个命令窗口,程序在其中运行并返回它的输出。

如果我尝试使用 Start-Process-NoNewWindow 开关,脚本就会出错,提示找不到 exe 文件。

我更喜欢使用 Start-Process 来访问 -Wait 开关,因为脚本制作的程序和配置可能需要一些时间才能单独完成,而且我不希望以后的命令启动。

此代码在单独的命令窗口中运行可执行文件:

Start-Process DeploymentServer.UI.CommandLine.exe -ArgumentList "download --autoDownloadOn --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime" -Wait

此代码在 PowerShell 控制台中运行 exe:

.\DeploymentServer.UI.CommandLine.exe download --autoDownloadOn --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime

如果我将 -NoNewWindow 添加到 Start-Process 代码

Start-Process DeploymentServer.UI.CommandLine.exe -ArgumentList "download --autoDownloadOn --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime" -Wait -NoNewWindow

我收到以下错误:

Start-Process : This command cannot be executed due to the error: The systemcannot find the file specifieAt C:\Temp\SOLUS3Installv1.3.ps1:398 char:22+         Start-Process <<<<  DeploymentServer.UI.CommandLine.exe -ArgumentList "download --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime" -Wait -NoNewWindow    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

最佳答案

当您使用 -NoNewWindow 开关时,您应该在可执行文件名称前加上当前目录:

Start-Process .\DeploymentServer.UI.CommandLine.exe -ArgumentList "download --autoDownloadOn --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime" -Wait -NoNewWindow

背景信息:

Start-Process 尝试做的第一件事是通过 PowerShell 规则解析 -FilePath 参数的值。如果成功,它会将传递的值替换为命令的完整路径。如果不是,则保持值不变。

在 Windows API 中有两种启动新进程的方法:CreateProcessShellExecuteShellExecute 是默认设置,但如果您使用需要 CreateProcess 的 cmdlet 参数(例如,-NoNewWindow),则 CreateProcess 将被使用。它们之间的区别(对这个问题很重要)是,在寻找要执行的命令时,CreateProcess 使用当前进程的工作目录,而 ShellExecute 使用指定的工作目录目录(默认情况下 Start-Process 根据当前文件系统提供程序位置传递,除非通过 -WorkingDirectory 明确指定)。

PS Test:\> 1..3 |
>> ForEach-Object {
>> New-Item -Path $_ -ItemType Directory | Out-Null
>> Add-Type -TypeDefinition @"
>> static class Test {
>> static void Main(){
>> System.Console.WriteLine($_);
>> System.Console.ReadKey(true);
>> }
>> }
>> "@ -OutputAssembly $_\Test.exe
>> }
PS Test:\> [IO.Directory]::SetCurrentDirectory((Convert-Path 2))
PS Test:\> Set-Location 1
PS Test:\1> Start-Process -FilePath Test -WorkingDirectory ..\3 -Wait # Use ShellExecute. Print 3 in new windows.
PS Test:\1> Start-Process -FilePath .\Test -WorkingDirectory ..\3 -Wait # Use ShellExecute. Print 1 in new windows.
PS Test:\1> Start-Process -FilePath Test -WorkingDirectory ..\3 -Wait -NoNewWindow # Use CreateProcess.
2
PS Test:\1> Start-Process -FilePath .\Test -WorkingDirectory ..\3 -Wait -NoNewWindow # Use CreateProcess.
1

当您更改 FileSystem 提供程序的当前位置时,PowerShell 不会更新当前进程的工作目录,因此目录可能不同。

当你输入时:

Start-Process DeploymentServer.UI.CommandLine.exe -Wait -NoNewWindow

Start-Process 无法通过 PowerShell 规则解析 DeploymentServer.UI.CommandLine.exe,因为它不查找当前的 FileSystem 位置默认。它使用 CreateProcess,因为您指定了 -NoNewWindow 开关。因此,它最终会在当前进程的工作目录中寻找 DeploymentServer.UI.CommandLine.exe,但该目录不包含此文件,因此会导致错误。

关于windows - 使用 Start-Process 时禁止打开命令窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35113917/

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