2

PowerShell を使用して、リモート サーバーのリストからデータを収集し、それを JSON オブジェクトに変換しています。すべて正常に動作していますが、除外できないような非常に奇妙な出力が得られます。

結果をパイプして、Invoke-Commandプロパティを除外しようとしました。また、返されたハッシュ ファイルからアイテムを手動で削除しようとしましたが、削除できないようです。

私は何が欠けていますか?

編集:

ここで何が問題なのかを理解するために、単純化されていますが、まだ壊れているスクリプトがあります。

$returnedServer = @{}
$pass = cat "C:\...\securestring.txt" | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "UserName",$pass
$s = @("xx.xxx.xxx.xxx","xx.xxx.xxx.xxx") 


foreach($server in $s)
{
    $returnedServer.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock 
{
1
}-credential $mycred | select -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName) 

$returnedServer| ConvertTo-Json

どの出力:

{
"xx.xxx.xxx.xxx":  [
                       {
                           "value":  1,
                           "PSComputerName":  "xx.xxx.xxx.xxx",
                           "RunspaceId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                           "PSShowComputerName":  xxxx
                       }
                   ],
"xx.xxx.xxx.xxx":  [
                       {
                           "value":  1,
                           "PSComputerName":  "xx.xxx.xxx.xxx",
                           "RunspaceId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                           "PSShowComputerName":  xxxx
                       }
                   ]
}
4

4 に答える 4

2

Select-ObjectJSON 出力に表示したいプロパティのみに結果を制限するために使用する必要があります。

$returnedServers.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock 
{
...$serverHash = various look ups and calculations...
$serverHash
} | select PropertyA, PropertyB, ...)

より完全な回答を得るには、「さまざまな検索と計算」と実際の JSON への変換についてさらに詳しく調べる必要があります

于 2014-03-13T20:27:09.070 に答える
2

この投稿は非常に古いですが、6年経っても受け入れられる答えを見つけることができなかったので、自分で書きました.

$invokeCommandResults | ForEach-Object {
  $_.PSObject.Properties.Remove('PSComputerName')
  $_.PSObject.Properties.Remove('RunspaceId')
  $_.PSObject.Properties.Remove('PSShowComputerName')
}
于 2020-05-16T17:08:07.267 に答える
1

いくつかのテストの後、問題はオブジェクト タイプにあるようです。返された結果を明示的にキャストすることで、テスト スクリプトを機能させることができました。

$returnedServer = @{}
$pass = cat "C:\...\securestring.txt" | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "UserName",$pass
$s = @("xx.xxx.xxx.xxx","xx.xxx.xxx.xxx") 




foreach($server in $s)
{
  $returnedServer.$server += ,[int](Invoke-Command -ComputerName $server -ScriptBlock {1} -credential $mycred) 
}
$returnedServer| ConvertTo-Json
于 2014-03-13T20:31:46.097 に答える
-1

これを試すことができます...無関係なプロパティ値を除外しようとする代わりに、具体的に、必要なものを「呼び出す」または「つかむ」だけです。

クイックコードショートカットのヒント!ところで、Invoke-Command -Computer $server -Scriptbock {command}次を使用して大幅に簡略化できます。icm $server {command}

さて、軌道に乗って…

元の投稿/例を使用すると、他のすべての値、つまり -ExcludeProperty (非常にイライラする) を除外して、1 つの「値」を利用しようとしているようです。

唯一の除外セクションを削除して置き換えることから始めましょう。

select -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName

代わりに、次のいずれかを使用してみてください。

1番目の方法:変更された元のコマンドを使用して...

  $returnedServer.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock {1}-credential $mycred).value 

2番目の方法:「icm」バージョンを使用...

  $returnedServer.$server += ,(icm $server {1} -credential $mycred).value

基本的に、必要な値を「選択」しています (プロパティ値を除外するのとは対照的に、機能しない場合はかなりイライラします)。


関連する例は次のとおりです。

一般的なシステム Powershell/WMIC コマンド コールを次に示します。

icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}

しかし、オブジェクト グロブから「バージョン」のみが必要な場合はどうすればよいでしょうか。

(icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}).version

しかし、ちょっと待ってください。オブジェクト グロブからの「lastbootuptime」だけが必要です。

(icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}).lastbootuptime

優柔不断ですが、もっと柔軟になりたいです。

$a=icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}
$a.version
$a.lastbootuptime
$a.csname

(理にかなっている?)

がんばれ〜PhilC

于 2015-04-22T05:26:23.050 に答える