我有一个带有工作流和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)
这可能吗?我做错了什么?
答案 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