Receive-Job
を呼び出したときに返される正しい/予想される変数タイプを取得する方法はありますか ?
バックグラウンドジョブを使用しているため、タイプの忠実度が失われます :返されるオブジェクトはメソッドレスのエミュレーション 元のタイプの。
元のタイプを手動で再作成することは、努力する価値がなく、不可能な場合もあります。ただし、おそらくエミュレーションを使用するだけで十分です。
更新 :あなた自身の答えに従って、System.DataSet
での作業から切り替えます System.DataTable
へ 結果として、サービス可能なエミュレーションが実現しました。
詳細については、下部のセクションを参照してください。
- Invoke-Sqlcmdコマンドを使用して、別のADアカウントでSQLクエリを実行するためのより良い方法はありますか?
処理中が必要です タイプの忠実度を維持するための呼び出しメソッド 、しかし、別のユーザーになりすます場合は、任意のコマンドでそれが可能だとは思いません。 。
たとえば、Start-Job
の代わりとなるインプロセス(スレッドベース) -Start-ThreadJob
--Credential
がありません パラメータ。
したがって、最善の策は、Invoke-SqlCmd
を作成することです。 の-Credential
パラメータが機能するか、特定のユーザーのクレデンシャルを使用してクエリを実行する別の処理中の方法を見つけます。
バックグラウンドジョブ/リモーティング/ミニシェルでのオブジェクトのシリアル化と逆シリアル化:
PowerShellがプロセスの境界を越えてオブジェクトをマーシャリングするときはいつでも 、XMLベースのシリアル化を採用しています ソースで、逆シリアル化 目的地で 、 CLI XMLと呼ばれる形式を使用します (共通言語インフラストラクチャXML)。
これは、PowerShellリモーティングのコンテキストで発生します (例:Invoke-Command
-ComputerName
を使用した呼び出し パラメータ)およびバックグラウンドジョブ (Start-Job
)およびいわゆるミニシェル (これは、PowerShell自体の内部からスクリプトブロックを使用してPowerShellCLIを呼び出すときに暗黙的に使用されます。;例:powershell.exe { Get-Item / }
。
この逆シリアル化により、タイプの忠実度が維持されます 既知のタイプの限定されたセットの場合のみ 、MS-PSRPで指定されているように、PowerShellRemotingProtocol仕様。つまり、固定されたタイプのセットのインスタンスのみが元のタイプとして逆シリアル化されます 。
他のすべてのタイプのインスタンスはエミュレートされます :リストのようなタイプは[System.Collections.ArrayList]
になります インスタンスでは、辞書タイプは[hasthable]
になります インスタンス、およびその他のタイプは、メソッドレス(プロパティのみ)カスタムオブジェクトになります ([pscustomobject]
インスタンス) 、その.pstypenames
プロパティには、接頭辞Deserialized.
が付いた元のタイプ名が含まれます (例:Deserialized.System.Data.DataTable
)、およびタイプの baseの同じプレフィックス名 タイプ(継承階層)。
さらに、再帰の深さ 非のオブジェクトグラフの場合 -[pscustomobject]
インスタンスは1
に制限されています レベル -これには、PowerShellカスタムクラスのインスタンスが含まれることに注意してください。 、class
で作成 キーワード:つまり、入力オブジェクトのプロパティ値自体が既知の型のインスタンスではない場合(後者には、[int]
などの.NETプリミティブ型を含む単一値のみの型が含まれます 、複数のプロパティで構成される型とは対照的に)、それらは.ToString()
に置き換えられます。 表現(例:System.IO.DirectoryInfo
と入力します .Parent
があります 別のSystem.IO.DirectoryInfo
であるプロパティ インスタンス。つまり、.Parent
プロパティ値は.ToString()
としてシリアル化されます そのインスタンスの表現。これはフルパス文字列です)。つまり、非カスタム(スカラー)オブジェクトは、それ自体が既知の型のインスタンスではないプロパティ値が .ToString()
に置き換えられるようにシリアル化されます。 表現 ;具体的な例については、この回答を参照してください。
対照的に、明示的 Export-Clixml
を介したCLIXMLシリアル化の使用 デフォルトの深さは2
(-Depth
を使用してカスタム深度を指定できます 基盤となるSystem.Management.Automation.PSSerializer
を使用すると、同様に深度を制御できます。 直接と入力します 。
元のタイプによっては、 元のタイプのインスタンスを手動で再構築できる 、ただし、これは保証されていません。(.pstypenames[0] -replace '^Deserialized\.'
を呼び出すと、元のタイプのフルネームを取得できます。 特定のカスタムオブジェクトで。)
ただし、処理のニーズに応じて、エミュレーション 元のオブジェクトの数で十分な場合があります。