2017-08-15 3 views
1

私たちは通常にスタンドアロンのPowerShellセッションで実行しますPowerShellスクリプト(StartBackup.ps1)の実行を動かしてるに設定されていますC#アプリケーション。スクリプトは通常PowerShellで直接実行され、モジュール/ DLLをインポートしたり、他のスクリプトに呼び出したり、さまざまな変数を設定したりします。

using (PowerShell powerShell = PowerShell.Create()) 
{ 
    powerShell.AddCommand("Set-ExecutionPolicy"); 
    powerShell.AddParameter("Scope", "Process"); 
    powerShell.AddParameter("ExecutionPolicy", "RemoteSigned"); 

    powerShell.AddCommand("Set-Location"); 
    powerShell.AddParameter("Path", "E:\\BackupTools"); 

    powerShell.AddCommand("E:\\BackupTools\\StartBackup.ps1", false); 
    powerShell.AddParameter("Type", "Closed"); 

    Collection<PSObject> results = powerShell.Invoke(); 

    foreach (var resultItem in results) 
    { 
     ... 
    } 
} 

上記の実行がちょうど$グローバル時点まで罰金:C#アプリケーションで

は、私が持っているものが設定されます、そして、それはエラーをスローするように始まることがあります。これらの値はすべて空白です。

は、私は、スクリプトの実行後にこれらの値が設定されているかどうかをチェックするためにpowerShell.AddCommandsのカップルを追加し、彼らが実際にPowerShellのインスタンス内のすべてのNULLです。スタンドアロンシェルでは、すべてうまくセットされています。

ここで問題は何ですか? PowerShellインスタンスが実際のシェルと異なるのはなぜですか?

編集:意図は、スクリプトを起動して忘れることではありません。その意図は、PowerShellインスタンスの中に残すアーティファクトがあれば、powershell.exeの場合と同じように作業を続けていくことです。

+0

$グローバルなものを設定したり、エラーを取得しますどこが示されていません。 –

+0

'Set-Location'コマンドは効果がありません。これは問題を引き起こす可能性があります。しかし、[mcve]がなければ、確実に何かを言うのは難しいです。 – PetSerAl

+0

@PetSerAl、効果がない理由を詳しく説明できますか? – RecursiveCall

答えて

1

あなただけの既存のPowerShellスクリプトを実行したい場合は、最も簡単な方法は、Processクラスを使用することです。コマンドラインをビルドして実行することができます。

C#コードでスクリプト自体をビルドする場合は、C#PowerShellクラスが必要です。

はまた、あなたのAddCommandは、コマンドをチェーンします。それはあなたの必要条件ですか?

MSDN post

コールAddCommand()メソッドは、実行パイプラインにこのコンテンツを追加します。

using (PowerShell PowerShellInstance = PowerShell.Create()) 
{ 
    // use "AddScript" to add the contents of a script file to the end of the execution pipeline. 
    // use "AddCommand" to add individual commands/cmdlets to the end of the execution pipeline. 
    PowerShellInstance.AddScript("param($param1) $d = get-date; $s = 'test string value'; " + 
      "$d; $s; $param1; get-service"); 

    // use "AddParameter" to add a single parameter to the last command/script on the pipeline. 
    PowerShellInstance.AddParameter("param1", "parameter 1 value!"); 
} 
+0

これは私の大変な大失敗でした。 $グローバルなものは確かに外部に設定されていました。ポリシー、パス、および最終的なスクリプトコマンドの間にPowerShell.Invoker()がありませんでした。 – RecursiveCall

関連する問題