Windows 禁止在使用启动进程时打开命令窗口

Windows 禁止在使用启动进程时打开命令窗口,windows,powershell,Windows,Powershell,我正试图找到一种方法,使PowerShell在使用启动进程运行可执行文件时不产生命令窗口 如果我直接在脚本中调用可执行文件(例如\program.exe),则程序将运行(带参数),输出将返回到PowerShell窗口 如果我使用启动进程,程序将生成一个命令窗口,程序将在其中运行并返回其输出 如果我尝试使用启动进程的-nonewindow开关,脚本就会出错,说找不到exe文件 我更愿意使用Start Process来访问-Wait开关,因为脚本生成的程序和配置可能需要一些时间才能单独完成,我不希望

我正试图找到一种方法,使PowerShell在使用
启动进程运行可执行文件时不产生命令窗口

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

如果我使用
启动进程
,程序将生成一个命令窗口,程序将在其中运行并返回其输出

如果我尝试使用
启动进程
-nonewindow
开关,脚本就会出错,说找不到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
如果我将-nonewindow添加到启动流程代码中

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 system cannot find the file specifie At 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 启动进程:由于系统错误,无法执行此命令 找不到文件说明符 在C:\Temp\SOLUS3Installv1.3.ps1:398 char:22
+启动进程使用
-nonewindow
开关时,应在可执行文件名称前加上当前目录前缀:

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

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

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

PS测试:\>1..3|
>>ForEach对象{
>>新项目-路径$\项目类型目录|输出Null
>>添加类型-类型定义@”
>>静态类测试{
>>静态void Main(){
>>System.Console.WriteLine($);
>>System.Console.ReadKey(true);
>>             }
>>         }
>>“@-OutputAssembly$\uUx\Test.exe
>> }
PS测试:\>[IO.Directory]::SetCurrentDirectory((转换路径2))
PS测试:\>设置位置1
PS测试:\1>启动进程-文件路径测试-工作目录..\3-等待#使用ShellExecute。在新窗口中打印3。
PS Test:\1>启动进程-文件路径。\Test-工作目录..\3-等待#使用ShellExecute。在新窗口中打印1。
PS测试:\1>启动进程-文件路径测试-工作目录..\3-等待-非工作窗口#使用CreateProcess。
2.
PS Test:\1>启动进程-文件路径。\Test-工作目录..\3-等待-非工作窗口#使用CreateProcess。
1.
更改
文件系统
提供程序的当前位置时,PowerShell不会更新当前进程的工作目录,因此目录可能会有所不同

键入时:

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

启动进程
无法通过PowerShell规则解析
DeploymentServer.UI.CommandLine.exe
,因为默认情况下它不会在当前的
文件系统
位置中查找。并且它使用
创建进程
,因为您指定了
-nonewindow
开关。因此,它最终会查找
DeploymentServer.UI.CommandLine.exe位于当前进程的工作目录中,该目录不包含此文件,因此会导致错误。

您可以
(启动进程。\program.exe-nonewindow-PassThru)。WaitForExit()
优秀的背景信息。为了鼓励良好做法,可能值得推荐始终在当前目录中调用前缀为
\
的可执行文件,即使在您不严格需要它的情况下也是如此。这样做明确地表达了意图,并防止意外执行不同的可执行文件。(由于格式问题而重新发布了注释。)只是一个附加提示(在@PetSerAl的帮助下):要使当前进程使用与PS相同的工作目录,请运行
[Environment]::CurrentDirectory=(Get Location-PSProvider FileSystem)。ProviderPath
(更详细的等效项是
[Environment]::CurrentDirectory=$ExecutionContext.SessionState.Path.CurrentFileSystemLocation.ProviderPath