1

私は 2 つのアプリを 1 つを c# で、もう 1 つを powershell 1.0 で作成しています。コードのある時点で、サーバー名を示す文字列を c# アプリから、作成した powershell スクリプト ファイルに渡したいのですが、どのように送信すればよいですか?それ?どうすればそれを受け入れることができますか?

私のコード:

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);

Pipeline pipeline = runspace.CreatePipeline();

String scriptfile = @"c:\test.ps1";

Command myCommand = new Command(scriptfile, false);
CommandParameter testParam = new CommandParameter("username", "serverName");

myCommand.Parameters.Add(testParam);


pipeline.Commands.Add(myCommand);
Collection<PSObject> psObjects;
psObjects = pipeline.Invoke();
runspace.Close();

そして私のpowershellスクリプト

param([string]$Username)

write-host $username 

私は何が欠けていますか?私はpowershellでちょっと新しいです。

4

1 に答える 1

1

PowerShell 2.0 と 3.0 を搭載したマシンがありますが、1.0 は搭載していないため、結果が異なる場合があります。PowerShell 3.0 ボックスでコードを実行すると、次のようになります。

ホスト プログラムまたはコマンド タイプがユーザー対話をサポートしていないため、ユーザーにプロンプ​​トを表示するコマンドが失敗しました。Windows PowerShell コンソールや Windows PowerShell ISE などのユーザー操作をサポートするホスト プログラムを試し、Windows PowerShell ワークフローなどのユーザー操作をサポートしないコマンド タイプからプロンプト関連のコマンドを削除します。

書き込みホストが気に入らなかったので、スクリプトを次のように変更しました

param([string]$Username)

Get-Date
Get-ChildItem -Path $userName

Get-Date を使用して、パラメーターと GCI に依存せずに出力を確認できるようにしました。コードを次のように変更しました。

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
using (var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
    runspace.Open();

    String scriptfile = @"..\..\..\test.ps1";
    String path = @"C:\Users\Public\";

    var pipeline = runspace.CreatePipeline();
    pipeline.Commands.Add(new Command("Set-ExecutionPolicy RemoteSigned -Scope Process", true));
    pipeline.Invoke();

    pipeline = runspace.CreatePipeline();
    var myCommand = new Command(scriptfile, false);
    var testParam = new CommandParameter("username", path);
    myCommand.Parameters.Add(testParam);
    pipeline.Commands.Add(myCommand);
    var psObjects = pipeline.Invoke();
    foreach (var obj in psObjects)
    {
        Console.WriteLine(obj.ToString());
    }
    runspace.Close();
}

Console.WriteLine("Press a key to continue...");
Console.ReadKey(true);

PoSh 2 と 3 の両方で、エラーなく実行され、フォルダーの内容が表示されました。

情報については、現在のプロセスの実行ポリシーのみを設定している場合は、昇格して実行する必要がないため、コード内で実行できました。

于 2013-05-10T18:07:14.300 に答える