在Powershell工作流程中显示变量

时间:2017-03-19 13:50:23

标签: powershell imagemagick

我在工作流程之前需要定义了五个变量,但我无法了解如何执行此操作。

将变量放在工作流程中会使它们可见,但这会导致CSV导入出现问题,这意味着会向与我不想要的工作流程相关的对象添加额外的属性。

代码如下:

$source = 'C:\Users\Koozer\a place\'
$rotateParams = 90, 90, 270
$cropParams = @(64, 64), (32, 0)

$images = Import-Csv "${source}images.csv"
$colNames = $images[0].psobject.properties.Name

Workflow StitchCropWorkflow {

    foreach -parallel ($imageSet in $images) {
        $magickRotParams = ''
        $n = 0

        foreach ($image in $colNames) {
            $magickRotParams += '`( '''+$source+$imageSet.($image)+''' -rotate '+$rotateParams[$n]+' `) '
            $n++
        }

        $finfo = [io.fileinfo]$imagePathSets[0]
        $command = 'magick '+$magickRotParams+' +append -crop '+$cropParams[0][0]+'x'+$cropParams[0][1]+'+'+$cropParams[1][0]+'+'+$cropParams[1][1]+' +repage '''+$finfo.DirectoryName+'\'+$finfo.BaseName+'_stitch_crop'+$finfo.Extension+''''
        echo $command
        Invoke-Expression $command
    }
}

StitchCropWorkflow

2 个答案:

答案 0 :(得分:1)

您可以将参数传递给工作流,就像对函数执行操作一样:

$source = 'C:\Users\Koozer\a place\'
$rotateParams = 90, 90, 270
$cropParams = @(64, 64), (32, 0)

$images = Import-Csv "${source}images.csv"
$colNames = $images[0].psobject.properties.Name

Workflow StitchCropWorkflow {
    param (
        $source,
        $rotateParams,
        $cropParams,
        $images,
        $colNames
    )

    # your code here
}

StitchCropWorkflow $source $rotateParams $cropParams $images $colNames

答案 1 :(得分:0)

如果在包含工作流的脚本中定义变量,则要访问工作流中的变量,语法为$using:variable

例如,这是一个powershell脚本,其中包含具有单个参数的工作流。

param([string]$ComputerName)
 $VerbosePreference = "Continue"
workflow Start-Reboot {
    param($server)

        Write-Verbose "Input server is $server"

        InlineScript{
        New-Item -Path C:\Scripts\Logging\Start-Reboot-Single.log -ItemType File -ErrorAction SilentlyContinue | Out-Null
        }

            Sequence{

            InlineScript
            {
                Try
                {

    Get-WmiObject -ComputerName $using:server -Class Win32_Service -Filter "Name='HealthService'" | Invoke-WmiMethod -Name PauseService | Out-Null

    $operatingSystem = Get-WmiObject Win32_OperatingSystem -ComputerName $using:server -ErrorAction stop
    $LastReboot = [Management.ManagementDateTimeConverter]::ToDateTime($operatingSystem.LastBootUpTime).ToString().Trim()

    Write-Verbose "Last reboot time for $using:server is $LastReboot"

    Write-Verbose "Here we restart $using:server, for testing no reboot is done"

    Restart-Computer -ComputerName $using:server -Wait -For Wmi -Force

    $OSRecheck = Get-WmiObject Win32_OperatingSystem -ComputerName $using:server -ErrorAction stop
    $CurrentReboot =  [Management.ManagementDateTimeConverter]::ToDateTime($OSRecheck.LastBootUpTime).ToString().Trim()

    $props = [Ordered]@{
        Server=$using:server
        LastReboot=$LastReboot
        CurrentReboot=$CurrentReboot
        }

            } Catch {
                Write-Verbose "Oh no, problem with $using:server"
                $rnd = Get-Random -Minimum 1 -Maximum 5
                Start-Sleep -Seconds $rnd
                $err = $_.Exception.GetType().FullName
                    $props = [Ordered]@{
                    Server=$using:server
                    LastReboot=$err
                    CurrentReboot=$null
                    }
                } Finally {

        $object = New-Object -TypeName PSObject -Property $props

        $random = Get-Random -Minimum 2 -Maximum 15

        Start-Sleep -Seconds $random

        Write-Output $object | Out-File -Append -FilePath C:\Scripts\Logging\Start-Reboot-Single.log
        }

            }#inline end

            }#sequence end

}#end workflow block
 Start-Reboot -server $ComputerName