[英]Passing parameters into raw powershell script from c# app
我有問題從ac#application傳遞參數/參數到我的powershell腳本。 問題是我有一個存儲在我的數據庫中的powershell腳本要執行。 這個腳本接受參數及其在傳入的參數中似乎沒有的參數。 我正在做的一個例子如下。 tasjRun.Task.Script是實際腳本而不是ps1文件的路徑,我認為這可能是問題所在? 我可以將參數傳遞給原始腳本嗎?
非常感謝
理查德
var runspaceConfiguration = RunspaceConfiguration.Create();
var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open ();
var pipeline = runspace.CreatePipeline();
var myCommand = new Command(taskRun.Task.Script, true);
foreach (var kvp in taskRun.GetScriptParameters())
{
myCommand.Parameters.Add(new CommandParameter(kvp.Key, kvp.Value));
}
pipeline.Commands.Add(myCommand);
var result = pipeline.Invoke().FirstOrDefault();
我可以告訴你,你的方法原則上是有效的,例如:
var runspaceConfiguration = RunspaceConfiguration.Create();
var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
var pipeline = runspace.CreatePipeline();
var script = "param($p1,$p2) \"p1 is $p1, p2 is $p2\"";
var myCommand = new Command(script, true);
myCommand.Parameters.Add(new CommandParameter("p1", DateTime.Now));
myCommand.Parameters.Add(new CommandParameter("p2", Math.PI));
pipeline.Commands.Add(myCommand);
var result = pipeline.Invoke().FirstOrDefault();
Console.WriteLine(result);
輸出:
p1 is 12/16/2011 10:24:48, p2 is 3.14159265358979
因此,我們需要查看您的腳本,以便更好地確定為什么這對您不起作用。
我是stackoverflow的新手,所以請原諒任何奇怪的格式。 我知道這個帖子已經老了,但我今天自己遇到了這個問題,並且無法在網上找到明確的解決方案,所以我想我會分享一個同事和我的解決方案。
訣竅在於,如果您正在調用實際腳本(例如“C:\\ scripts \\ sendEmail.ps1”),那么您需要以與從命令行運行腳本時相同的方式傳遞參數。 在下面的代碼中,說personName =“Joe”和personsEmail =“Joe@yahoo.com”。 我假設taskRun.Task.Script是PS腳本的完整路徑。
如果你打印myCommand,它應該是“C:\\ scripts \\ sendEmail.ps1 -Name Joe -Email Joe@yahoo.com”,其中-Name和-Email對應於sendEmail.ps1中的$ Name和$ Email參數(請確保你在PS腳本中正確設置參數!)
myCommand.Parameters.Add()在這種情況下不起作用,因為它假定您的命令是實際命令,而不是完整腳本。 myCommand.Parameters.Add()適用於這種情況:如果你寫了var myCommand = new Command(“gwmi Win32_Bios”); 然后把myCommand.Parameters.Add(“computerName”,“myComputer”); 和myCommand.Parameters.Add(“憑證”,“myPassword”); 其中“myComputer”和“myPassword”是硬編碼的字符串,你會得到命令“gwmi win32_Bios -computerName myComputer -credential myPassword”哪個應該執行正常(它不會像我寫的那樣返回數據,但它將正確傳遞參數)。
對不起,這已經很久了,但我希望它清楚,因為我在這個問題上掙扎了很長一段時間。 完整代碼如下。 僅供參考,您不需要runspaceConfiguration來創建Runspace對象。
var runspaceConfiguration = RunspaceConfiguration.Create();
var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
var pipeline = runspace.CreatePipeline();
var myCommand = new Command(String.Format("{0} -Name {1} -Email {2}", taskRun.Task.Script, personsName, personsEmail), true);
pipeline.Commands.Add(myCommand);
var result = pipeline.Invoke().FirstOrDefault();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.