将变量从C#传递到Powershell

将变量从C#传递到Powershell,c#,visual-studio-2010,powershell,C#,Visual Studio 2010,Powershell,我正在处理一个C#项目,该项目应该获取一个字符串变量(文件路径)并将其传递给PowerShell脚本,以便对其执行进一步的命令。我一直在网上四处寻找,并通过堆栈,一直未能找到适合我的东西 这是我目前的C#代码: string script = System.IO.File.ReadAllText(@"C:\my\script\path\script.ps1"); using (Runspace runspace = RunspaceFactory.CreateRunspace()) {

我正在处理一个C#项目,该项目应该获取一个字符串变量(文件路径)并将其传递给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.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”)

PowerShell代码:

Function LocalCopy
{
    $path = $args[0]
    Get-ChildItem -path $path -Filter *.tib -Recurse | 
    Copy-Item -Destination "C:\Users\file1\file2\local\"
}
任何帮助都将不胜感激。谢谢

ps.AddArgument("C:\Users\file1\file2\file3\");
您可以使用参数在powershell中获取参数

$path = $args[0]

我会按照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();

所以我假设如果我想把它作为C端的变量,我可以这样做:
ps.AddArgument(pathvaribale)?OP问题比仅仅为函数添加一个参数更基本。当执行ps.AddScript(script)时,它会在新的作用域中执行脚本,这样定义的函数在被调用后就不可用了。必须传递false才能使脚本在当前作用域中运行,以便在调用脚本后函数保持不变,例如ps.AddScript(script,false);你看过了吗?我没有,但现在我有:)如果我需要将文件路径作为变量传递,我会像这样做吗
ps.Runspace.SessionStateProxy.SetVariable(“path”,variablepath)?如果需要设置一个名为
$Path
的PowerShell变量,该变量随后将被脚本使用,则选择“是”。你会这样做的。但是,在您的情况下,您可以通过C变量将路径传递给函数调用,如@Anand所示,但您可以执行此操作
ps.AddArgument(someCSharpVariable)
。您需要修改函数以使用param($path)块或使用$path=$args[0]。然后将该变量与命令一起使用:gci$path*.tib-r。我刚刚将代码更新为当前使用的代码。我真的不太明白
$path=$args[0]
是怎么回事,但我仍然觉得我的错误是通过我更新的c#或powershell代码产生的。您对我正在做的事情有什么想法/解释吗?您需要将参数添加到函数调用中,例如ps.AddCommand(“LocalCopy”).AddArgument(FilePathVariable)。请参阅我的答案的更新,因为要让它发挥作用还有很多。实际上,我只是在两篇文章之间发现了这一点,但我只是将powershell部分移到函数之外,而不是按照您的建议执行。我可以试试你做的,因为它看起来干净一点。
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();