gpt4 book ai didi

c# - 将变量从 C# 传递到 Powershell

转载 作者:太空狗 更新时间:2023-10-30 00:15:00 25 4
gpt4 key购买 nike

我正在开发一个 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#代码:

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\"
}

任何帮助将不胜感激。谢谢!

最佳答案

我会按照 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# - 将变量从 C# 传递到 Powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18210223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com