简体   繁体   English

是否可以在工作流中调用命令?

[英]Is it possible to invoke-command with in a workflow?

Do anyone know if I can use Invoke-Command in a PowerShell workflow?有谁知道我是否可以在 PowerShell 工作流中使用Invoke-Command

Currently I have script that loops through a text file with the list of services but I would like it push to all of the servers at once verses going through one by one.目前我有一个脚本,它循环遍历一个带有服务列表的文本文件,但我希望它一次推送到所有服务器,一首一首。 Is this possible?这可能吗?

This is the current script block I am working with:这是我正在使用的当前脚本块:

{
    ForEach ($Server in $Servers) {
        Write-Host "Copying code to $Server..."

        If (!(Test-Path -path \\$Server\c$\Websites\Versions\v$version)) {
            New-Item \\$Server\c$\Websites\Versions\v$version -Type Directory | Out-Null
        }

        Copy-Item .\Packages\v$version\* \\$Server\c$\Websites\Versions\v$version -Force -Recurse

        Write-Host "Converting to application on $Server..."

        Invoke-Command -ComputerName $Server -ScriptBlock $Script -Argumentlist $Version | Out-Null
    }
}

The PowerShell Workflow engine is not capable of directly invoking PowerShell cmdlets. PowerShell 工作流引擎无法直接调用 PowerShell cmdlet。 Instead, if a script writer calls a PowerShell cmdlet inside a Workflow definition, the PowerShell Workflow engine will automatically wrap invocations of PowerShell cmdlets inside the InlineScript Workflow Activity.相反,如果脚本编写者在工作流定义中调用 PowerShell cmdlet,PowerShell 工作流引擎将自动将 PowerShell cmdlet 的调用包含在InlineScript工作流活动中。

workflow test
{
  ForEach ($Server in $Servers) {
      Write-Host "Copying code to $Server..."

      If (!(Test-Path -path \\$Server\c$\Websites\Versions\v$version)) {
          New-Item \\$Server\c$\Websites\Versions\v$version -Type Directory | Out-Null
      }

      Copy-Item .\Packages\v$version\* \\$Server\c$\Websites\Versions\v$version -Force -Recurse

      Write-Host "Converting to application on $Server..."

      InlineScript {
          Invoke-Command -ComputerName $Server -ScriptBlock $Script -Argumentlist $Version | Out-Null
      }
  }
}

As for whether or not it will work, you'll have to try it out, as suggested by Mathias.至于它是否会起作用,您必须按照 Mathias 的建议进行尝试。

@Trevor's response is good as an overall skeleton, but it won't work as it is. @Trevor 的回应作为一个整体框架很好,但它不会像现在这样工作。 There are several things missing or incorrect:有几件事情缺失或不正确:

  • Passing arguments to workflow将参数传递给工作流
  • Passing arguments to InlineScript将参数传递给 InlineScript
  • Passing ScriptBlock as an argument;将 ScriptBlock 作为参数传递;
  • Using Out-Null in workflow在工作流中使用 Out-Null

The working example:工作示例:

$serversProd=@"
server1
server2
server3
server4
"@-split'\r\n'

$reportScript = "report.script.ps1"


$generateReport = {
    param($reportScript)

    cd D:\Automations\ConnectivityCheck
    powershell -file $reportScript
}

workflow check-connectivity {
    Param ($servers, $actionBlock, $reportScript)

    # Prepare the results folder
    $resultsFolder = "D:\Automations\ConnectivityCheckResults"
    $unused1 = mkdir -Force $resultsFolder

    # Run on all servers in parallel
    foreach -parallel ($server in $servers) {
        # Upload script to the server
        $unused2 = mkdir -Force \\$server\D$\Automations\ConnectivityCheck
        cp -Force $reportScript \\$server\D$\Automations\ConnectivityCheck\

        "Starting on $server..."

        # Execute script on the server. It should contain Start-Transcript and Stop-Transcript commands
        # For example: 
        # $hostname = $(Get-Wmiobject -Class Win32_ComputerSystem).Name
        # $date = (Get-Date).ToString("yyyyMMdd")
        # Start-Transcript -path ".\$date.$hostname.connectivity.report.txt"
        # ...Code...
        # Stop-Transcript

        $results = InlineScript {
            $scriptBlock = [scriptblock]::Create($Using:actionBlock)
            Invoke-Command -computername $Using:server -ScriptBlock $scriptBlock -ArgumentList $Using:reportScript
        }

        # Download transcript file from the server
        $transcript = [regex]::Match($results,"Transcript started.+?file is \.\\([^\s]+)").groups[1].value
        "Completed on $server. Transcript file: $transcript"
        cp -Force \\$server\D$\Automations\ConnectivityCheck\$transcript $resultsFolder\
    }
}

cls
# Execute workflow
check-connectivity $serversProd $generateReport $reportScript

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM