10

我正在尝试使用 C# 运行调用命令 cmdlet,但我无法找出正确的语法。我只想运行这个简单的命令:

invoke-command -ComputerName mycomp.mylab.com -ScriptBlock {"get-childitem C:\windows"}

在 C# 代码中,我完成了以下操作:

InitialSessionState initial = InitialSessionState.CreateDefault();
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddCommand("invoke-command");
ps.AddParameter("ComputerName", "mycomp.mylab.com");
ps.AddParameter("ScriptBlock", "get-childitem C:\\windows");
foreach (PSObject obj in ps.Invoke())
{
   // Do Something
}

当我运行它时,我得到一个异常:

Cannot bind parameter 'ScriptBlock'. Cannot convert the "get-childitem C:\windows" value of type "System.String" to type "System.Management.Automation.ScriptBlock".

我猜我需要在某处使用 ScriptBlock 类型,但不知道如何使用。这只是一个简单的入门示例,实际用例将涉及运行一个更大的脚本块,其中包含多个命令,因此非常感谢任何有关如何执行此操作的帮助。

谢谢

4

4 回答 4

14

啊,ScriptBlock 本身的参数需要是ScriptBlock 类型。

完整代码:

InitialSessionState initial = InitialSessionState.CreateDefault();
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddCommand("invoke-command");
ps.AddParameter("ComputerName", "mycomp.mylab.com");
ScriptBlock filter = ScriptBlock.Create("Get-childitem C:\\windows");
ps.AddParameter("ScriptBlock", filter);
foreach (PSObject obj in ps.Invoke())
{
   // Do Something
}

如果将来有人发现它有用,请将答案放在这里

于 2013-08-16T15:49:27.153 回答
3

脚本块字符串应该匹配格式为“{ ... }”。使用下面的代码就可以了:

ps.AddParameter("ScriptBlock", "{ get-childitem C:\\windows }");
于 2013-08-27T01:13:57.787 回答
2

您使用短格式:

ps.AddParameter("ScriptBlock", ScriptBlock.Create("Get-childitem C:\\Windows"));
于 2017-06-01T09:07:11.333 回答
2

在某些情况下可能更合适的替代方法。

        var remoteComputer = new Uri(String.Format("{0}://{1}:5985/wsman", "HTTP", "ComputerName"));
        var connection = new WSManConnectionInfo(remoteComputer, null, TopTest.GetCredential());

        var runspace = RunspaceFactory.CreateRunspace(connection);
        runspace.Open();

        var powershell = PowerShell.Create();
        powershell.Runspace = runspace;

        powershell.AddScript("$env:ComputerName");

        var result = powershell.Invoke();

https://blogs.msdn.microsoft.com/schlepticons/2012/03/23/powershell-automation-and-remoting-ac-love-story/

于 2017-08-11T15:11:14.863 回答