2011-12-16 18 views
2

我有問題從c#應用程序將參數/參數傳遞到我的PowerShell腳本中。問題是我有一個PowerShell腳本存儲在我的數據庫中執行。這個腳本需要參數和它的這似乎沒有采取我的傳入參數。下面是我正在做的一個例子。 tasjRun.Task.Script是實際的腳本,而不是ps1文件的路徑,我認爲這可能是問題所在?我可以將參數傳遞給原始腳本嗎?從c#應用程序將參數傳遞到原始powershell腳本

非常感謝

理查德

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(); 
+0

您是否檢查過[this](http://stackoverflow.com/q/527513/172695)問題? – 2011-12-16 13:23:14

回答

3

我可以告訴你,你的方法工作原理例如爲:

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 

所以我們就需要看看你的腳本,以便更好地確定爲什麼這不適合你。

1

我是新來的stackoverflow,所以原諒任何奇怪的格式。我知道這個帖子是舊的,但我今天自己有這個問題,無法在網上找到明確的解決方案,所以我想我會分享我的同事和我的一個解決方案。

訣竅是如果你正在調用一個實際的腳本(例如「C:\ scripts \ sendEmail.ps1」),那麼你需要傳遞參數,就像你從命令運行腳本一樣線。在我的代碼下面,說personName =「喬」和personsEmail =「[email protected]」。我假設taskRun.Task.Script是一個PS腳本的完整路徑。

如果您打印myCommand,它應該讀取「C:\ scripts \ sendEmail.ps1-名稱Joe -Email [email protected]」,其中-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(「credential」,「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(); 
相關問題