C# 等から .ps1 が呼ばれる場合、引数はパイプラインとして渡されます。
パイプライン引数は、自動変数である $input に格納されるのですが、パイプラインなのでそのままでは引数としてスクリプトで扱うことが出来ません。
この問題を解決するには、@($input) とすれば配列に戻すことが出来ます。
パイプラインで引数を渡すのは、PowerShell でも可能なのでテストしてみましょう。
# 呼ばれる側のコード(test01.ps1) [array] $a = @($input) $a[0].GetType() $a[0] echo "" $a[1].GetType() $a[1] | %{ $_.ToString("x2")} |
# 呼ぶ側のコード [uint16] $Data1 = 128 [byte[]] $Data2 = @(0x00, 0x01, 0x03, 0x04) $Data1, $Data2 | .\Test01.ps1 |
無事引数を取り出すことが出来ました。
C# から PowerShell スクリプトをの呼び出し方はこちらをどうぞ
C# 上で PowerShell スクリプトを実行 - Windows PowerShell | ++C++;
// 未確認飛行 C
https://ufcpp.net/study/powershell/interop.html
C# から PowerShell スクリプトを実行しようとすると、以下のようなエラーが発生します。
System.Management.Automation.PSSecurityException: このシステムではスクリプトの実行が無効になっているため、ファイル [スクリプトファイル名] を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。 ---> System.UnauthorizedAccessException: このシステムではスクリプトの実行が無効になっているため、ファイル [スクリプトファイル名] を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
実行許可を与えるには、PowerShell を管理権限で起動して、以下コマンドを入力します。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force |
C# から PowerShell スクリプトには byte[] が渡せないようなので、byte[] を渡す場合は Base64 でエンコードした文字列を渡す必要があります。
受け取った Base64 を byte[] に戻すには、FromBase64String を使います。
[byte[]]$ByteArray = [System.Convert]::FromBase64String($Base64String) |
Copyright © MURA All rights reserved.