簡體   English   中英

如何向 powershell 腳本 (System.Management.Automation.Powershell) 提供參數?

[英]How to supply parameters to powershell script (System.Management.Automation.Powershell)?

我需要從C# 應用程序運行PowerShell腳本。 我喜歡為此使用方法AddScript 而且效果很好。 但是,當我使用AddParameters方法向腳本添加參數時,它似乎沒有按預期工作。

這是測試負載 ( PowerShell ):

param ([string]$Arg1, [string]$Arg2, [switch]$ArgParamless)
$filename = "payload_with_params.txt"
$filepath = $env:temp
$fullpath = Join-Path -Path $filepath -ChildPath $filename

$dt = Get-Date -Format "yyyy.MM.dd HH:mm:ss"
$val = $dt+' '+$Arg1+' '+$Arg2+' '+$ArgParamless
Add-Content -Path $fullpath -Value "$val"

如果我像這樣從 PS 推送它,它工作得很好:

.\payload_with_params.ps1 -Arg1 "Bla 1" -Arg2 "Bla 2" -ArgParamless

結果:

2023.01.19 16:58:10 Bla 1 Bla 2 True

C#代碼(過於簡化):

string command = File.ReadAllText(pathToPS1);

List<CommandParameter> paramList = new List<CommandParameter>();
paramList.Add(new CommandParameter("Arg1", "Bla 1"));
paramList.Add(new CommandParameter("Arg2", "Bla 2"));
paramList.Add(new CommandParameter("ArgParamless"));

using (PowerShell ps = PowerShell.Create())
{
    //Adding script file content to object
    ps.AddScript(command);
    if (paramList != null)
    {
        if (paramList.Count > 0)
        {
            //Adding Params to object;
            ps.AddParameters(paramList);    
        }
    }
    //Launching
    ps.Invoke();
}

結果:

2023.01.19 16:54:00 System.Management.Automation.Runspaces.CommandParameter System.Management.Automation.Runspaces.CommandParameter False

所以.. 它沒有像我預期的那樣工作。 我應該如何為腳本提供參數?

對於[switch]參數,您需要綁定一個bool - PowerShell 會將true解釋為“Present”,將false解釋為“Absent”:

paramList.Add(new CommandParameter("ArgParamless", true));

好吧,事實證明 AddParameter(CommandParameter) 方法不起作用。

這種方法有效:

string command = File.ReadAllText(pathToPS1);
using (PowerShell ps = PowerShell.Create())
{
    //Adding script file content to object
    ps.AddScript(command);
    if (paramList != null)
    {
        if (paramList.Count > 0)
        {
            //Adding Params to object;
            ps.AddArgument("-Arg1 XXXXXX");
        }
    }
    //Launching
    ps.Invoke();
}

在 PowerShell 結束時,可以從 $args 數組中提取此 arguments 以供使用:

$arglist = $args -join " "

使用哈希表的更好方法:

string command = File.ReadAllText(pathToPS1);
using (PowerShell ps = PowerShell.Create())
{
    //Adding script file content to object
    ps.AddScript(command);
    if (paramList != null)
    {
        if (paramList.Count > 0)
        {
            //Adding Params to object;
            var hashtable = new Hashtable {
                { "Arg1", "XXXXXX" },
                { "Arg2", "YYYYYY" },
                { "ArgParamless", true }
            };
            ps.AddArgument(hashtable);
        }
    }
    //Launching
    ps.Invoke();
}

這就是您在 PS 端使用它所做的事情:

function Wrapper-Test ([string]$Arg1, [string]$Arg2, [switch]$ArgParamless) {
    $Result = $Args1+' '+$Args2+' '+$ArgParamless
    return $Result
}

$MyArgs = "";
$MyArg = $args[0]
$MyArgs = Wrapper-Test @MyArg;

$filename = "payload_with_params.txt"
$filepath = $env:temp
$fullpath = Join-Path -Path $filepath -ChildPath $filename

$dt = Get-Date -Format "yyyy.MM.dd HH:mm:ss"
$arglist = $args -join " "
$val = $dt + " " + $MyArgs
Add-Content -Path $fullpath -Value "$val"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM