Home > Windows にまつわる e.t.c.

PowerShell スクリプトに渡されるパイプライン引数の使い方


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)

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.