C#調用PowerShell的經歷

很久沒有寫程序了, 再次上手也處於功能強大的Windows PowerShell的緣故. 很少話, 先上段代碼引入正題....shell

 1        static Collection<PSObject> RunPowershell(string filePath, string parameters)
 2         {
 3             RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
 4             Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
 5             runspace.Open();
 6             RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
 7             Pipeline pipeline = runspace.CreatePipeline();
 8             Command scriptCommand = new Command(filePath);
 9             Collection<CommandParameter> commandParameters = new Collection<CommandParameter>();
10             foreach (var parameter in parameters.Split(' '))
11             {
12                 CommandParameter commandParm = new CommandParameter(null, parameter);
13                 commandParameters.Add(commandParm);
14                 scriptCommand.Parameters.Add(commandParm);
15             }
16             pipeline.Commands.Add(scriptCommand);
17             Collection<PSObject> psObjects;
18             psObjects = pipeline.Invoke();
19             if (pipeline.Error.Count > 0)
20              {
21                  throw new Exception("Something is wrong in PowerShell script.");
22              }
23  
24              runspace.Close();
25  
26              return psObjects;
27         }

編譯開始後,反饋問題是缺乏 windows

using System.Management.Automation;
using System.Management.Automation.Runspaces;服務器

的引用。 baidu查看不少都是提到要安裝SDK之類的。考慮當前用的編輯器就是Visual Studio 2013 Premium,思考應該已經包含這個DLL了吧。編輯器

其實它就在系統目錄下的,參考C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35目錄下,這個是windows 7 Pro 64bit的存放位置。測試

編譯經過後測試運行,而拋出一個程序異常錯誤信息,錯誤停留在上述第18行代碼處。通過一番檢查後發現問題是,本機PowerShell的ExecutionPolicy是Restricted,這個能夠經過以下命令檢查:spa

.\Get-ExecutionPolicycode

這個狀況在Windows 2008服務器也遇到並修改過。修改的方式是執行命令:blog

.\Set-ExecutionPolicy RemoteSignedip

但此次無效,緣由是註冊表不被受權已PowerShell命令方式更改。 沒轍只能手工進入註冊表修改了 Computer\HKEY_LOCAL_MACHINE\SOFAWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\下ExecutionPolicy項的鍵值爲"RemoteSigned" (注:這鍵值項多是不存在的,你能夠建立它)。rem

完成這些後,就能夠Run這段程序了。

相關文章
相關標籤/搜索