如何在C#中将Powershell命令管道连接在一起

本文关键字:命令 管道 连接 在一起 Powershell 中将 | 更新日期: 2023-09-27 18:24:41

我在Powershell 2中有一组命令,其中一个函数的输出是下一个函数,但在第一个函数的输入中,我可以从结果中选择一个值,该值将作为下一个功能的输入。

例如

Get-RDUserSession | ? {$_.username -eq "myuser"} | Disconnect-User

在我的示例中,我选择了一个名为"myuser"的用户,并将该用户传递到一个名"Disconnect user"的函数中以执行某些操作。所有这些都在Powershell中工作,但我希望能够在C#中复制这一点,而无需编写多行代码。

有没有可能在C#中像在Powershell中那样在一行中复制这一点?

如何在C#中将Powershell命令管道连接在一起

当然,你最终会得到这样的东西:

GetRDUserSessionMethod().Where(u => u.username == "myuser")
                        .ToList()
                        .ForEach(DisconnectUser);

则CCD_ 1将只需要返回一个CCD_。

ToList()是必需的,因为MS从未决定在IEnumerable<T>上有这样的扩展方法,出于各种原因(类型安全!),这将是对该语言的一个很好的补充。如果你想避免每次都做ToList(),那么自己写一个是非常琐碎的,快速而肮脏的例子:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (T element in source)
    { 
        action(element);
    }
}

可以讨论一下这是否比常规的foreach { }语句更可读——可能和开发人员一样多。就我个人而言,我对编写这样的代码没有意见。

command1&amp;command2

假设使用c#重新启动名为"XYZ"的服务

net stop"XYZ"&amp;净启动"XYZ"

代码示例为,

using (Process command = new Process())
{        
    command.StartInfo = new ProcessStartInfo
    {
        CreateNoWindow = true,
        FileName = CommonStrings.RestartProccesCommand,
        Arguments = COMMAND1 && COMMAND2,
        LoadUserProfile = false,
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
    };
    command.Start();
    command.WaitForExit(3000);
    exitCode = command.ExitCode;
}