powershell 写入cmdlet内的文件时出现问题?

s3fp2yjn  于 2023-02-16  发布在  Shell
关注(0)|答案(3)|浏览(112)

我只涉足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'
}
olhwl3o2

olhwl3o21#

$LogFile = "D:\APIRead\logs\master.log"

尝试将此线移动到事件-操作中
它可能正在尝试展开$LogFile,但未在操作的作用域中定义。

vcirk6k6

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

$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' }

# Note the use of -MessageData
Register-ObjectEvent $fsw Created -SourceIdentifier PaymentsMKFileCreated -MessageData $LogFile -Action { 
  $name = $Event.SourceEventArgs.Name 
  $changeType = $Event.SourceEventArgs.ChangeType 
  $timeStamp = $Event.TimeGenerated
  $logFile = $Event.MessageData # Get the log file path from the -MessageData argument
  $Output = "The file '$name' was $changeType at $timeStamp"
  Write-Host $Output
  Out-File -FilePath $logFile -InputObject $Output -Append
}

注:

  • 有关使用hashtable将 * 多个 * 值从调用方的作用域传递到-Action脚本块的示例,请参见this answer
  • 甚至可以通过$ExecutionContext.SessionState将调用者的整个状态传递给-MessageData,这允许-Action块通过$Event.MessageData.PSVariable.GetValue('varName')从调用者的状态中检索任何变量
cotxawn7

cotxawn73#

删除了附加后的**,并确保您对正在写入的目录具有权限。
添加-如果文件不存在,强制使其创建该文件。

Out-File -FilePath $LogFile -InputObject $Output -Append -Force

相关问题