我只涉足PS,所以我可能错过了一些明显的,但这似乎应该工作,哈哈
我有一个文件监视器,在一个特定的文件夹中寻找一个特定的文件,当找到它时触发一个动作。这个动作首先写入屏幕,然后写入日志文件,然后触发一个后续脚本。
写入屏幕可以,写入日志文件不行,触发后续脚本也可以。实际上我尝试了几种不同的写入日志文件的方法,甚至在这部分之前构建了一个函数并调用它,就像用Write-Log代替Write-Host一样,但它也不起作用。
是否有一种特殊的方法可以用我尝试的方式写入日志?
$folder = 'D:\InputFiles\'
$filter = 'data.csv'
$LogFile = "D:\APIRead\logs\master.log"
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier PaymentsMKFileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$Output = "The file '$name' was $changeType at $timeStamp"
Write-Host $Output
Out-File -FilePath $LogFile -InputObject $Output -Append
#Invoke-Item 'D:\APIRead\scripts\process.bat'
}
3条答案
按热度按时间olhwl3o21#
尝试将此线移动到事件-操作中
它可能正在尝试展开$LogFile,但未在操作的作用域中定义。
vcirk6k62#
Grok42's helpful answer为该问题提供了实用的解决方案:通过定义在
-Action
脚本块中定义$LogFile
*,使其在那里可用(但仅在那里可用)。实际上,传递到
Register-ObjectEvent
cmdlet的-Action
参数的script block{ ... }
通常 * 不 * 看到在 * 调用者的 * 作用域中定义的变量(除非那些变量碰巧在 * global * 作用域中定义),因为这样的脚本块在dynamic module中运行。但是,您可能仍然希望在 * caller的 * 作用域中声明
$LogFile
变量,同时 * 还 * 允许在-Action
脚本块中引用它,以便 * 两个 * 作用域都可以作用于它。为此,您可以使用
Register-ObjectEvent
的-MessageData
参数将一个值传递给-Action
脚本块,它可以通过自动变量$Event
将其引用为$Event.MessageData
:注:
-Action
脚本块的示例,请参见this answer。$ExecutionContext.SessionState
将调用者的整个状态传递给-MessageData
,这允许-Action
块通过$Event.MessageData.PSVariable.GetValue('varName')
从调用者的状态中检索任何变量cotxawn73#
删除了附加后的**,并确保您对正在写入的目录具有权限。
添加-如果文件不存在,强制使其创建该文件。