4

私は、文字列変数 (ファイル パス) を取得し、それを PowerShell スクリプトに渡して、さらにコマンドを実行することになっている C# プロジェクトに取り組んでいます。私はオンラインやスタックを見回してきましたが、自分に合ったものを見つけることができませんでした...

現在の私のC#コードは次のとおりです。

string script = System.IO.File.ReadAllText(@"C:\my\script\path\script.ps1");

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{

    runspace.Open();
    PowerShell ps = PowerShell.Create();
    ps.Runspace = runspace;
    ps.AddScript(script);
    ps.Invoke();
    ps.AddCommand("LocalCopy");

    foreach (PSObject result in ps.Invoke())
    {
        Console.WriteLine(result);
    }
}                   

これが私のPowerShellスクリプトです:

Function LocalCopy
{
    Get-ChildItem -path "C:\Users\file1\file2\file3\" -Filter *.tib -Recurse | 
    Copy-Item -Destination "C:\Users\file1\file2\local\"
}

私がやりたいのは、スクリプトの最初の部分です: "C:\Users\file1\file2\file3\"C# コードから PowerShell スクリプトに渡すことができる変数 (私が想定しているもの) に置き換えます。私は PowerShell を使用するのに非常に慣れていないため、このようなことを行う方法がよくわかりません。

- -編集 - -

コードにまだ問題がありますが、エラーは発生していません。変数がまだ渡されていないためだと思います...

C# コード:

string script = System.IO.File.ReadAllText(@"C:\my\script\path\script.ps1");

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{

    runspace.Open();
    PowerShell ps = PowerShell.Create();
    ps.Runspace = runspace;
    ps.AddScript(script);
    ps.Invoke();
    ps.AddArgument(FilePathVariable);
    ps.AddCommand("LocalCopy");

    foreach (PSObject result in ps.Invoke())
    {
        Console.WriteLine(result);
    }
}

PowerShell コード:

Function LocalCopy
{
    $path = $args[0]
    Get-ChildItem -path $path -Filter *.tib -Recurse | 
    Copy-Item -Destination "C:\Users\file1\file2\local\"
}

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

6

私はアナンドがあなたのスクリプトにパスを渡すために示したルートに行きます。しかし、タイトルによって提起された質問に答えるために、C# から変数を渡す方法を次に示します。これは、実際に PowerShell エンジンで変数を設定する方法です。

ps.Runspace.SessionStateProxy.SetVariable("Path", @"C:\Users\file1\file2\file3\");

注: C# では、ファイル パスに逐語的な@文字列を使用する必要があります。

更新:コメントに基づいて、これを試してください:

runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddScript(script, false); // Use false to tell PowerShell to run script in current 
                             // scope otherwise LocalCopy function won't be available
                             // later when we try to invoke it.
ps.Invoke();
ps.Commands.Clear();
ps.AddCommand("LocalCopy").AddArgument(FilePathVariable);
ps.Invoke();
于 2013-08-13T16:41:47.043 に答える