簡體   English   中英

將參數從c#app傳遞到原始PowerShell腳本

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

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