为什么“读取主机”部分在代码之前运行?

时间:2019-05-02 14:55:23

标签: powershell read-host

我只想要一个.ps1文件,该文件将运行简单的Powershell行,但不会立即关闭。

我试图做“ read-host -prompt”“”,但是它在代码运行之前显示,然后仍然立即关闭

get-appxpackage -allusers | select name 

read-host -prompt "Press enter to exit"

我希望结果是我运行文件,然后有机会在按某些东西退出之前在powershell窗口中读取输出。但是实际的输出是在运行代码之前提示退出,然后在输出中运行并关闭

2 个答案:

答案 0 :(得分:0)

执行以下代码行:

get-appxpackage -allusers | select name 

您将准备好一些“待处理”对象,以返回到Powershell管道输出流。在Read-Host完成之前,无法将对象发送到管道(因为Powershell会将这些对象视为ps1文件的“输出”)。 Read-Host完成之后,对象将通过输出流发送到管道。由于那里没有其他cmdlet(使用ps1文件的输出),因此Powershells的默认行为是将管道内容输出到Powershell主机。

正如@Lee_Daily在上面的注释中已经提到的那样,添加Out-Host会将get-appxpackage -allusers | select name的输出发送到Powershell主机。因此get-appxpackage -allusers | select name | out-host没有对象在输出流中排队以进行进一步的管道操作。

我建议您检查以下来源:

这些是您必须了解的基本Powershell概念。

希望有帮助。

答案 1 :(得分:0)

标注Lee和Moerwald所说的话。

另一种实时流式传输方法是使用ForEach或ForEach-Object,它也比Out-Host方法具有更高的性能,因为它不是默认写入屏幕。如果后者的表现与屏幕写作对您来说很重要。如果您不希望Out-Host的屏幕输出,请将其发送到Null。

# Using Out-Host

Measure-Command {
    get-appxpackage -allusers | 
    select name | Out-Host
}



Name                                             
----                                             
1527c705-...            
...           
InputApp                                         
Microsoft.AAD.BrokerPlugin                       
Microsoft.AccountsControl                        
...                            


# Results

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
*** Milliseconds      : 643 ***
Ticks             : 6431627
TotalDays         : 7.44401273148148E-06
TotalHours        : 0.000178656305555556
TotalMinutes      : 0.0107193783333333
TotalSeconds      : 0.6431627
TotalMilliseconds : 643.1627



# User ForEach in a script Block

Measure-Command {
    & { foreach ($item in get-appxpackage -allusers | select name)
    { "processing $item"}}
}


# Results

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
*** Milliseconds      : 385 ***
Ticks             : 3858318
TotalDays         : 4.46564583333333E-06
TotalHours        : 0.0001071755
TotalMinutes      : 0.00643053
TotalSeconds      : 0.3858318
TotalMilliseconds : 385.8318



# Standard ForEach-Object

Measure-Command {
    get-appxpackage -allusers | 
    ForEach-Object {select name}
}


# Results

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
*** Milliseconds      : 498 ***
Ticks             : 4988494
TotalDays         : 5.77371990740741E-06
TotalHours        : 0.000138569277777778
TotalMinutes      : 0.00831415666666667
TotalSeconds      : 0.4988494
TotalMilliseconds : 498.8494