调用PS脚本,保存返回的字符串

时间:2015-06-29 01:20:46

标签: c# powershell

我的PS脚本返回一个字符串。

Function GetData {
Param(
    [string]$id
)
Process
{
    return "Value is $id"
}

GetData -id $arg

以下是调用PS脚本的C#:

        PowerShell ps = PowerShell.Create();
        string psScript = "GetData.ps1";
        ps.AddScript(psScript);
        // only takes one parameter
        ps.AddParameter("25");
        Collection<PSObject> results = ps.Invoke();

        foreach (PSObject r in results)
        {
            Console.WriteLine(r.ToString());
        }
        Console.ReadLine();

什么都没有回来。

我仔细检查了脚本,当我直接在PowerShell中调用脚本时手动传入路径时,它会返回一个值。我还确保在项目的属性中,Platform目标是x64(基于另一个问题&#39; s的错误)。我也尝试直接将结果保存在Invoke方法中,但它给出了一个错误,这表明我必须将它实际保存在一个集合中,即使它是一个记录。

忘了,也试过了:

psParam = "25";
string psScript = "GetData.ps1 -arg'" + psParam + "'";

在控制台上没有结果。

测试过:

        PowerShell ps = PowerShell.Create();
        string psScript = ".\\GetData.ps1";
        ps.AddCommand(psScript);
        ps.AddArgument("25");
        Collection<PSObject> results = ps.Invoke();

        foreach (PSObject r in results)
        {
            Console.WriteLine(r.ToString());
        }
        Console.ReadLine();

并且使用了上述大多数错误,因为它说 GetData.ps1不被识别为cmdlet,函数,脚本文件或可操作程序的名称。如果我直接指向它将它放在我的C盘(C:\GetData.ps1)上,它什么都不做。

仔细检查;我在脚本里面调用最后一行的函数:

GetData -id $arg

这是对的吗?

2 个答案:

答案 0 :(得分:0)

注意你的功能。它得到一个开放的大括号'{',但不是匹配的紧密大括号'}'。您有缺陷的PowerShell代码将发出代码未捕获的错误。

更正此简单错误后,请注意您是如何调用函数的。什么是$arg?我保证你任何自动变量。看看 about_automatic_variables ......

P.S。:你最好在社交活动中提出这样一个非常困难的问题。 technet。微软。 com /论坛/ windowsserver / en-US / home?forum = winserverpowershell。如果你这样做了,答案就会在几个小时前发布。

答案 1 :(得分:0)

问题在于&#34;返回&#34;不是你的想法。

在Powershell中,&#34;返回值&#34;是执行结束时堆栈上的最后一个值。在你的情况下,只需省略&#34; return&#34;关键字,字符串将按预期出现。

Function return value in PowerShell

或者,您可以使用Write-Output,它会将数据显式地发送到输出,就像C风格的return语句一样。

注意 NOT 使用Write-Host,因为它直接写入powershell主机,跳过管道,从不给你机会看到值