Как я могу печатать на консоли внутри параллельного цикла PowerShell - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть простой рабочий процесс для запуска некоторых команд в параллельном foreach l oop, но я не могу понять, как печатать на консоль из l oop.

$names = @('foo', 'bar', 'bat')
Workflow Test-Print
{
    foreach -Parallel ($name in $names)
    {
        # execute some commands on #name

        (InlineScript {Write-Host "Hello $name";}) # doesn't print
        Write-Output "Hello $name" # doesn't print
        Write-Host "Hello $name" # error
        Write-Information "Hello $name" # doesn't print
        Write-Verbose "Hello $name" # doesn't print, even with -Verbose flag
    }
}

Test-Print -Verbose

1 Ответ

0 голосов
/ 23 апреля 2020

Это работает как задумано. Обратите внимание только на незначительное изменение, которое я сделал.

workflow ForEachParaTest {

   param([string[]]$computers)

   'OS & PowerShell Version'
   (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
   $PSVersionTable

   foreach –parallel ($computer in $computers)
   {

    # Write current target to screen
    "Processing $computer"

   }

}
ForEachParaTest -Computers 'server01', 'server02', 'server03' 

<#
# Results

OS & PowerShell Version
Microsoft Windows 10 Pro

Name                           Value
----                           -----
PSRemotingProtocolVersion      2.3
BuildVersion                   10.0.18362.752
PSVersion                      5.1.18362.752
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.752}
PSEdition                      Desktop
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
SerializationVersion           1.1.0.1

Processing server03
Processing server02
Processing server01
#>

Если я добавлю обратно все, что у вас было. Вы можете видеть, что из 6 вариантов, только 4 будут успешными.

workflow ForEachParaTest {

   param([string[]]$computers)

   'OS & PowerShell Version'
   (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
   $PSVersionTable

   foreach –parallel ($computer in $computers)
   {

    # Write current target to screen
    # Using PS Default
    "`nProcessing $computer using PowerShell default output`n"

    (InlineScript {Write-Host "`nProcessing $computer using Write-Host via inline script for output`n"}) 

    Write-Output "`nProcessing localhost using Write-Output for output`n"

    Write-Host "`nProcessing $computer using Write-Host for output`n" 

    Write-Information "`nProcessing $computer using Write-Information for output`n"

    Write-Verbose "`nProcessing $computer using Write-Verbose for output`n"

   }

}
ForEachParaTest -Computers 'server01', 'server02', 'server03'

<#
# Results

At line:20 char:5
+     Write-Host "`nProcessing $computer using Write-Host for output`n"
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cannot call the 'Write-Host' command. Other commands from this module... 
command requires an interactive Windows PowerShell session, or has be...
Write-Host }) where it will be invoked in isolation.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : CommandActivityExcluded

OS & PowerShell Version
Microsoft Windows 10 Pro

Name                           Value                                                                                                                                                       
----                           -----                                                                                                                                                       
PSRemotingProtocolVersion      2.3                                                                                                                                                         
BuildVersion                   10.0.18362.752                                                                                                                                              
PSVersion                      5.1.18362.752                                                                                                                                               
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.752}                                                                                                                    
PSEdition                      Desktop                                                                                                                                                     
CLRVersion                     4.0.30319.42000                                                                                                                                             
WSManStackVersion              3.0                                                                                                                                                         
SerializationVersion           1.1.0.1  

Processing server03
Processing server02
Processing server01

server01
server02
server03

server01
server02
server03

server01
server02
server03
#>

В общем, Write-Host следует избегать, за исключением случаев, когда это абсолютно необходимо. Подумайте, цвета, другие особенности форматирования, которые не будут работать без него. Кроме того, как вы заметите, если вы запустите это, "n" также не обрабатываются в WorkFlow, в нормальных случаях это будет.

Теперь, таким образом, мы получим немного Лучшее отображение и комментирование проблемных детей.

workflow ForEachParaTest {

   param([string[]]$computers)

   'OS & PowerShell Version'
   (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
   "`n"
   $PSVersionTable
   "`n"

   foreach –parallel ($computer in $computers)
   {

    "Processing $computer"

    # (InlineScript {Write-Host "`nProcessing $computer using Write-Host via inline script for output`n"}) 

    Write-Output "`nProcessing $computer using Write-Output for output`n"

    # Write-Host "`nProcessing $computer using Write-Host for output`n"

    Write-Information "`nProcessing $computer using Write-Information for output`n"

    Write-Verbose "`nProcessing $computer using Write-Verbose for output`n"

   }

}
ForEachParaTest -Computers 'server01', 'server02', 'server03' 

<#
# Results

OS & PowerShell Version
Microsoft Windows 10 Pro                      
BuildVersion                   10.0.18362.752
PSVersion                      5.1.18362.752
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0, 5.0, 5.1.18362.752}
PSEdition                      Desktop
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
SerializationVersion           1.1.0.1


Processing server03
Processing server02
Processing server01

Processing server03 using Write-Output for output


Processing server02 using Write-Output for output


Processing server01 using Write-Output for output
#>

Теперь вернемся к исходному сообщению и небольшим изменениям:

$names = @('foo', 'bar', 'bat')
Workflow Test-Print
{
    param([string[]]$names)
    foreach -Parallel ($name in $names)
    {
        # execute some commands on #name

        # (InlineScript {Write-Host "Hello $name";}) # doesn't print
        Write-Output "Hello $name" # doesn't print
        # Write-Host "Hello $name" # error
        Write-Information "Hello $name" # doesn't print
        Write-Verbose "Hello $name" # doesn't print, even with -Verbose flag
    }
}


Test-Print $names 

<#
# Results

Hello bat
Hello bar
Hello foo
#>

Test-Print $names -Verbose
<#
# Results

Hello bat
Hello bar
Hello foo
VERBOSE: [localhost]:Hello bat
VERBOSE: [localhost]:Hello bar
VERBOSE: [localhost]:Hello foo
#>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...