多线程Powershell脚本

时间:2014-02-27 22:35:10

标签: sql-server powershell smo

我正在使用powershell来编写数据库对象的脚本以进行定期审核。我现在已经达到了这一点,我在功能上很开心...但希望它更快一些。在SO上找到了这个并试图实现它...但是,我没有看到速度有任何改进。是否SMO连接的性质使得该过程无论如何都是串行的?谷歌获得的信息非常少......有人可以点亮一些光吗?

Can Powershell Run Commands in Parallel?

1 个答案:

答案 0 :(得分:1)

foreach -parallel construct只能在PowerShell工作流定义中使用,而不能在高级功能中使用。以下是您如何使用它的简短示例。

workflow Audit-DB {
    $ComputerList = @('server1', 'server2', 'server3')*100;
    foreach -parallel ($Computer in $ComputerList) {
        Get-Date -Format 'hh:mm:ss';
        # Run your database audit code here.
        } 
}

Audit-DB;

Get-Date位只是为了表明它确实并行工作。

当您在PowerShell Workflow中工作时,要记住的重要一点是,您只能调用活动,而不是PowerShell函数。 PowerShell会自动将其许多核心cmdlet转换为活动,但您需要了解其中的差异。值得庆幸的是,有一个名为InlineScript的活动允许您调用常规的PowerShell脚本代码。

Workflow的一个很酷的事情是你甚至不需要使用foreach -parallel结构。而是自动获取-PSComputerName参数,该参数允许您在远程计算机上部署工作流。这要求您提前在所有目标系统上配置PowerShell远程处理,因为Workflow位于它之上。

但是,它会变得更好! PowerShell工作流也隐式使您能够将工作流作为PowerShell后台作业执行!您所要做的就是在调用工作流程时添加-AsJob参数。

以下示例显示了InlineScript-AsJob参数以及如何将工作流部署到远程计算机。

workflow Audit-DBWorkflow {
    InlineScript {
        function Audit-DB {
            # Run your audit code here
        }

        Audit-DB;
    }
}

$ComputerList = @('localhost', 'localhost')*10; # Create an array of computers
Audit-DBWorkflow -PSComputerName $ComputerList -AsJob;