Почему раздел «Read-host» работает перед кодом? - PullRequest
0 голосов
/ 02 мая 2019

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

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

get-appxpackage -allusers | select name 

read-host -prompt "Press enter to exit"

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

Ответы [ 2 ]

0 голосов
/ 03 мая 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
0 голосов
/ 02 мая 2019

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

get-appxpackage -allusers | select name 

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...