我试图找到一种方法让PowerShell在使用Start-Process
运行可执行文件时不会生成命令窗口。
如果我直接在脚本中调用可执行文件(例如.\program.exe
),则程序运行(带有参数),输出将返回到PowerShell窗口。
如果我使用Start-Process
,程序会生成一个程序运行的命令窗口并返回它的输出。
如果我尝试使用-NoNewWindow
脚本的Start-Process
开关,则表示无法找到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 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
答案 0 :(得分:6)
使用-NoNewWindow
开关时,您应该在可执行文件名前加上当前目录:
Start-Process .\DeploymentServer.UI.CommandLine.exe -ArgumentList "download --autoDownloadOn --autoDownloadStartTime $StartTime --autoDownloadEndTime $EndTime" -Wait -NoNewWindow
背景资料:
Start-Process
尝试做的第一件事是通过PowerShell规则解析-FilePath
参数的值。如果成功,它将替换通过命令的完整路径传递的值。如果没有,它会使价值保持不变。
在Windows API中,有两种方法可以启动新流程:CreateProcess
和ShellExecute
。 ShellExecute
是默认设置,但如果您使用需要CreateProcess
的cmdlet参数(例如-NoNewWindow
),则会使用CreateProcess
。对于这个问题,它们之间的区别在于,当查找要执行的命令时,CreateProcess
使用当前进程&#39;工作目录,而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
PowerShell不会更新当前流程&#39;更改FileSystem
提供程序的当前位置时的工作目录,因此目录可能不同。
键入时:
Start-Process DeploymentServer.UI.CommandLine.exe -Wait -NoNewWindow
Start-Process
无法通过PowerShell规则解析DeploymentServer.UI.CommandLine.exe
,因为默认情况下它不会查找当前的FileSystem
位置。它使用CreateProcess
,因为您指定了-NoNewWindow
开关。因此,它最终在当前流程中寻找DeploymentServer.UI.CommandLine.exe
&#39;}工作目录,不包含此文件,从而导致错误。