4

我正在开发一个 C# 项目,该项目应该获取一个字符串变量(文件路径)并将其传递给 PowerShell 脚本以使用它完成进一步的命令。我一直在网上和通过 Stack 环顾四周,但找不到适合我的东西......

这是我现在的 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#代码:

字符串脚本 = 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

我会按照 Anand 展示的路线将路径传递到您的脚本中。但要回答您的标题提出的问题,以下是您从 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 回答
5
ps.AddArgument("C:\Users\file1\file2\file3\");

您可以使用 args 在 powershell 中获取参数。

$path = $args[0]

MSDN

于 2013-08-13T13:29:39.917 回答