[英]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.