Почему раздел Read-host запускается перед кодом?

Мне просто нужен файл .ps1, который будет запускать простую строку powershell, но не будет закрываться мгновенно.

Я пытался сделать "read-host -prompt" " ", но он отображается до запуска кода, а затем все равно мгновенно закрывается.

get-appxpackage -allusers | select name 

read-host -prompt "Press enter to exit"

Я ожидаю, что в результате я запущу файл, а затем получу возможность прочитать вывод в окне powershell, прежде чем нажимать что-то для выхода. Но фактический вывод предлагает выйти до запуска кода, а затем он проходит через вывод и закрывается.


person Jordan    schedule 02.05.2019    source источник
comment
Powershell имеет задержку в потоке вывода, чтобы увидеть, есть ли объекты, которые можно сгруппировать. из-за этой задержки ваш непрямой вывод отображается после вашего прямого вывода. обычное исправление = добавьте | Out-Host к вашей 1-й строке, чтобы она шла непосредственно на экран. [усмехнуться]   -  person Lee_Dailey    schedule 02.05.2019
comment
Возможный дубликат Невозможно приостановить или заснуть после выбора объекта   -  person user4003407    schedule 02.05.2019


Ответы (2)


После выполнения этой строки кода:

get-appxpackage -allusers | select name 

У вас будет несколько «ожидающих» объектов, готовых вернуться в выходной поток конвейеров Powershell. Объекты не могут быть отправлены в конвейер, пока Read-Host не завершится (поскольку Powershell будет рассматривать эти объекты как «выходные данные» вашего файла ps1). После завершения Read-Host объекты отправляются в конвейер (через выходной поток). Поскольку там нет другого командлета (использующего вывод вашего файла ps1), поведение Powershell по умолчанию заключается в выводе содержимого конвейера на хост Powershell.

Как @Lee_Daily уже упоминалось в комментарии выше, добавление Out-Host отправит вывод get-appxpackage -allusers | select name на хост Powershell. Таким образом, get-appxpackage -allusers | select name | out-host никакие объекты не ставятся в очередь в потоке вывода для дальнейших действий конвейера.

Я бы рекомендовал вам проверить следующие источники:

Это основные концепции Powershell, которые вам нужно понять.

Надеюсь, это поможет.

person Moerwald    schedule 02.05.2019
comment
@ Джордон, если вас устраивает мой ответ, отметьте его как решение (мне нужна репутация :-)). - person Moerwald; 02.05.2019

В дополнение к тому, что сказали Ли и Мёрвальд.

Другим способом потоковой передачи в реальном времени является использование ForEach или ForEach-Object, он также немного более эффективен, чем подход Out-Host, поскольку по умолчанию запись на экран не выполняется. Если для вас важна последняя производительность v экранная запись. Если вам не нужен вывод на экран 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
person postanote    schedule 03.05.2019