簡體   English   中英

如何使用 C# 將參數傳遞給 PowerShell 腳本?

[英]How to pass parameter to a PowerShell script using C#?

我正在嘗試使用C#執行 PowerShell 腳本

我的腳本需要參數才能運行,否則會引發錯誤。

這是我的腳本的精簡版

param ($url)
if ($url -eq $null) {
    throw "No Url was provided" 
}

write-host "$url was the provided value"

現在,使用C#我正在嘗試執行腳本如下

try {
    var defaultSessionState = InitialSessionState.CreateDefault();
    defaultSessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted;

    using PowerShell ps = PowerShell.Create(defaultSessionState);

    ps.AddScript(@"d:\test.ps1");
    ps.AddParameter("url", "http://example.com/test/");
    ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "stop");
} 
catch (Exception e) {

}

但我不斷收到No Url was provided錯誤。 如何正確地將參數傳遞給我的腳本,以及如何訪問它?

AddScript()用於執行原始代碼 - D:\test.ps1恰好是有效代碼,但它更意味着將完整的自包含腳本作為字符串放入。

您需要將腳本文件引用添加為命令,此時我們可以應用參數 - 為此,請改用AddCommand()

using (PowerShell ps = PowerShell.Create(defaultSessionState))
{
    ps.AddCommand("d:\test.ps1");
    ps.AddParameter("url", "http://example.com/test/");
    ps.AddParameter("ErrorAction", "Stop");
    // or
    ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "stop");
}

馬蒂亞斯 R。 Jessen 的有用答案提供了一個有效的解決方案,但讓我擴展解釋:

PowerShell SDK 的.AddScript()方法的名稱有點不恰當,因為它不執行腳本文件,而是執行任意一段 PowerShell 代碼 也就是說,它期望的是一個包含整個 PowerShell語句的字符串,換句話說:腳本文件的內容- 而不是腳本文件的路徑

鑒於在 PowerShell 中,一段可重用代碼被表示為一個腳本類似.AddScriptBlock()的名稱將是一個不那么容易混淆的名稱(但請注意,您不能將包含要執行的語句的字符串包含在{... }中你打電話給.AddScript() )。 [1]

Mathias 的回答顯示了.AddCommand()是如何正確使用的方法,因為 PowerShell 中的命令是代表可以直接執行的東西的任何東西:別名、函數、cmdlet、外部可執行文件 - 以及腳本文件


至於你嘗試了什么:

字符串d:\test.ps1被解釋為一段 PowerShell 代碼(與您在命令行上提交此字符串的方式相同)。 該代碼恰好調用了一個腳本文件,但沒有 arguments
也就是說,您的腳本被調用,但沒有您通過.AddParameter()添加的參數。

  • 另請注意,如果腳本路徑碰巧包含空格或嵌入的變量引用,則必須使用嵌入的引用並通過調用運算符&調用結果; 例如,
    .AddScript(@". 'd:\test 1.ps1'"); - 有關詳細信息,請參閱此對密切相關問題的答案

但是,請注意,您的.AddParameter()調用在技術上仍然有效,但接收參數的是整個腳本塊,而不是其中的(一個)語句 - 對d:\test.ps1調用。

從技術上講,可以將arguments中繼到腳本文件調用,方法是通過自動生成$args變量(在沒有通過param(...)堵塞):

ps.AddScript(@"d:\test.ps1 @args");

也就是說,如果您的所有代碼都是調用單個腳本文件(帶參數),那么.AddCommand()解決方案既簡單又高效; 此外,它避免了執行機器的 PowerShell 執行策略的潛在問題,只有.AddScript()添加的語句受制於該策略。


[1] .AddScript("...") ,以 PowerShell 代碼表示,有效地執行以下操作:
. {... }
也就是說,它將字符串解析為腳本塊,並通過. 點源操作符(當.Invoke()稍后被調用時)。

暫無
暫無

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

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