2013-07-30 43 views
1

我剛剛在兩天前開始使用PowerShell。我正在運行一個C#控制檯應用程序的PowerShell腳本。我將對象列表(MyObj1)作爲參數傳遞給腳本,並對該對象執行一些數據操作。但是,當我在腳本中調用一個函數時,在打印出錯誤時,我得到一個函數無法識別的錯誤。這是我正在做的一個小樣本。在C#應用程序腳本中調用PowerShell函數

public class MyObj1 
{ 
    public string Property1 {get; set;} 
    public int Property2 {get; set;} 
} 

下面是我使用運行腳本代碼的一部分:

var rs = RunspaceFactory.CreateRunspace(); 
rs.Open(); 
rs.SessionStateProxy.SetVariable("list", myObjectList); 
rs.SessionStateProxy.SetVariable("xml", xml); 
var ps = PowerShell.Create(); 
ps.Runspace = rs; 
var psScript = System.IO.File.ReadAllText(@"C:\temp\ps.ps1"); 
ps.AddScript(psScript); 
ps.Invoke(); 
foreach (var item in myObjectList) 
{ 
    Console.WriteLine(item.Property1 + "; " + item.Property1); 
} 

Console.WriteLine("\n================================ ERRORS ============================ \n"); 

foreach (ErrorRecord err in ps.Streams.Error) 
{ 
    Console.WriteLine(err.ToString()); 
} 

這裏是實際的腳本:

$list | ForEach { 
    $_.Property1 = $_.GetType() 
    DoSomeThing ([ref] $_) 
} 

Function DoSomeThing ($MyObject) 
{ 
    $Asset.Property2 = $Asset.Property2 + $Asset.Property2 
} 

兩天前,當我用打同樣的腳本使用上面的一些虛擬類,我能夠修改數據,但自今天上午以來,我已經修改了腳本以使用真實的類。而Ctrl + Z只會讓我回到編輯器的某個位置。在ForEach循環中,一切正常,直到我調用函數。

至於該項目,計劃是推動這個應用程序在C#中所需的數據操作,然後在腳本中完成一些可選的更改。重點是避免將應用程序推送到生產服務器,並處理腳本中的所有/大部分數據操作。

回答

1

將函數聲明移動到腳本文件的beginnig。

Function DoSomeThing ($MyObject) 
{ 
    $Asset.Property2 = $Asset.Property2 + $Asset.Property2 
} 

$list | ForEach { 
    $_.Property1 = $_.GetType() 
    DoSomeThing ([ref] $_) 
} 

PS不編譯腳本,它通過命令執行它的命令。所以你必須在使用它之前創建/聲明函數。

+0

有道理。將在AM中嘗試。如果我可以再次拿出我的舊樣本,我會在這裏發佈它,但我仍然有在$ list循環之後聲明的函數。 – Kenpachii

相關問題