web-dev-qa-db-ja.com

ScriptBlock内の複数のコマンド

Scriptblockパラメーター内で複数のコマンドを実行するのに問題があります。すべてのドキュメントは、コマンドレット間の分離にセミコロンを使用することを示しています。セミコロンでコマンドレットを区切るのと同じ方法を使用すると、ローカルマシンでは機能しますが、invoke-commandを使用してリモートマシンでは機能しません。

たとえば、以下のコードはGet-Serviceの結果のみを返し、Get-Processは返しません。

Invoke-Command -ComputerName cas-bkupexec -ScriptBlock { Get-Service;  Get-Process }

両方のコマンドが正常に実行され、それぞれの出力を受け取るという望ましい結果をどのように達成できますか?

6

私はこれを再現することができます..それは最初のステートメントのみを返します。セミコロンではありません。ブレークのように使用しても同じことを行います。

これらのオプションは機能します:

Invoke-Command -ComputerName computer -ScriptBlock {
    (Get-Service)
    Get-Process
}

またはこれは不思議なことに:

Invoke-Command -ComputerName computer -ScriptBlock {
    & { 
        Get-Service
        Get-Process
    }
}

それらの1つを( )でラップするので、これはパイプラインのちょっとした癖に違いないと思いますが、それが何をしているのか正確にはまだ理解できていません。

更新:

ソースマシンがv5とリモートv2を実行しているというコメントを読んだ後、私のテストでも同じことが行われていることに気付きました。

V5からそれ自体にリモート接続すると、問題は解消されました。

リモーティング元:

v2 -> v5: no issue
v2 -> itself: no issue
v2 -> other v2: no issue
v3 -> v2: no issue
v3 -> v5: no issue
v3 -> itself: no issue
v4 -> v2: no issue
v4 -> v3: no issue
v4 -> itself: no issue
v4 -> v5: no issue

ここではすべての組み合わせではありませんが、v5からv2へのバグである可能性があります。

5
briantist

それらをコンマで区切ることを試みることができます。これにより、結果が配列になり、各インデックスで確認できます。

$Results = Invoke-Command -ComputerName cas-bkupexec -ScriptBlock { (Get-Service), (Get-Process) }

#Services
$Results[0]

#Processes
$Results[1]
2
boeprox