我只想要一个.ps1文件,该文件将运行简单的Powershell行,但不会立即关闭。
我试图做“ read-host -prompt”“”,但是它在代码运行之前显示,然后仍然立即关闭
get-appxpackage -allusers | select name
read-host -prompt "Press enter to exit"
我希望结果是我运行文件,然后有机会在按某些东西退出之前在powershell窗口中读取输出。但是实际的输出是在运行代码之前提示退出,然后在输出中运行并关闭
答案 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