2 Вопрос: Почему раздел «Read-host» работает перед кодом?

вопрос создан в Thu, May 2, 2019 12:00 AM

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

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

get-appxpackage -allusers | select name 

read-host -prompt "Press enter to exit"

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

    
0
  1. powershell задерживает выходной поток, чтобы посмотреть, есть ли объекты, которые можно сгруппировать. эта задержка заставляет ваш косвенный выход показываться после вашего прямого выхода. обычное исправление = добавьте | Out-Host в свою 1-ю строку, чтобы он шел прямо на экран. [ Гринь ]
    2019-05-02 15: 02: 38Z
  2. 2019-05-02 15: 16: 54Z
2 ответа                              2                         

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

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, которые вы должны понимать.

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

    
0
2019-05-02 15: 15: 52Z
  1. Спасибо. Мне нужно будет прочитать о них:)
    2019-05-02 15: 31: 58Z
  2. @ Джордон, если вы не согласны с моим ответом, отметьте его как решение (мне нужна репутация: -)).
    2019-05-02 15: 48: 41Z

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

Еще один способ потоковой передачи в реальном времени - использование 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
2019-05-03 05: 38: 14Z
источник размещен Вот