在工作流/功能中使用全局功能

时间:2013-09-25 14:54:24

标签: powershell powershell-v3.0

我有一个带有工作流和2个简单功能的Windows PowerShell 3.0脚本。没有工作流程,我可以在Log函数中使用我的DoSomething函数,但我不能使用工作流程。脚本是:

function DoSomething()
{
    # This is NOT logged
    Log("This will fail...")
}

function global:Log([string]$Message)
{
    Add-Content -Path "C:\my.log" -Value $Message
}

workflow New-CustomWorkflow
{
    try
    {
        # This is logged
        Log("Starting with the workflow")
        DoSomething
    }
    catch
    {
        # This is logged
        Log($_)
    }
}

New-CustomWorkflow

my.log的内容如下所示:

从工作流程开始 System.Management.Automation.RemoteException:术语“日志”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。        在Microsoft.PowerShell.Activities.PSActivity.OnResumeBookmark(NativeActivityContext上下文,书签书签,对象值)        在System.Activities.Runtime.BookmarkCallbackWrapper.Invoke(NativeActivityContext上下文,书签书签,对象值)        在System.Activities.Runtime.BookmarkWorkItem.Execute(ActivityExecutor executor,BookmarkManager bookmarkManager)

这可能吗?我做错了什么?

1 个答案:

答案 0 :(得分:1)

在工作流程中,您调用的大部分内容都是工作流活动,包括try / catch和PowerShell命令之类的内容。要了解幕后发生的事情,请尝试以下方法:

(Get-Command New-CustomWorkflow).XamlDefinition

现在等你的头爆炸了。 : - )

顺便说一下,你可以拥有嵌套的功能和工作流程。这对我有用:

workflow New-CustomWorkflow
{
    function DoSomething()
    {
        workflow Log([string]$Message)
        {
            Add-Content -Path "$home\my.log" -Value $Message
        }

        # This is NOT logged
        Write-Output -InputObject "In DoSomething"
        Log -Message "This will fail..."
    }

    try
    {
        # This is logged
        Write-Output -InputObject "Before inline"
        Log -Message "Starting with the workflow"
        Write-Output -InputObject "After inline"
        DoSomething
    }
    catch
    {
        # This is logged
        Write-Output -Input "Doh $_"
        Log -Message $_
    }
}

New-CustomWorkflow