PowerShell文件夹监控日志优化:仅保留无路径无扩展名的文件名
解决方案
以下是修改后的PowerShell代码,会将操作日志中的文件路径替换为不含路径和扩展名的纯文件名,同时优化了CSV格式的写入逻辑,避免手动拼接可能导致的格式问题:
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO $Watcher = New-Object System.IO.FileSystemWatcher $Watcher.Path = "C:\Users\some_profile\Desktop\iguaracu_pr" $Watcher.IncludeSubdirectories = $true $Watcher.EnableRaisingEvents = $true ### DEFINE ACTIONS AFTER AN EVENT IS DETECTED $Action = { $ChangeType = $Event.SourceEventArgs.ChangeType # 根据事件类型处理文件名称 if ($ChangeType -eq 'Renamed') { $OldFileName = [System.IO.Path]::GetFileNameWithoutExtension($Event.SourceEventArgs.OldFullPath) $NewFileName = [System.IO.Path]::GetFileNameWithoutExtension($Event.SourceEventArgs.FullPath) $LogLine = [PSCustomObject]@{ ChangeType = $ChangeType OldName = $OldFileName NewName = $NewFileName } } else { $FileName = [System.IO.Path]::GetFileNameWithoutExtension($Event.SourceEventArgs.FullPath) $LogLine = [PSCustomObject]@{ ChangeType = $ChangeType FileName = $FileName } } # 追加写入CSV,自动处理格式 $LogLine | Export-Csv -Path "C:\Users\some_profile\Pictures\Duvidas\log.csv" -Append -NoTypeInformation -Encoding UTF8 } ### DECIDE WHICH EVENTS SHOULD BE WATCHED Register-ObjectEvent $Watcher "Created" -Action $Action Register-ObjectEvent $Watcher "Changed" -Action $Action Register-ObjectEvent $Watcher "Deleted" -Action $Action Register-ObjectEvent $Watcher "Renamed" -Action $Action while ($true) {sleep 5}
关键修改说明
- 提取纯文件名:使用.NET的
[System.IO.Path]::GetFileNameWithoutExtension()方法,直接从文件路径中提取不含路径和扩展名的文件名,比手动字符串分割更可靠,能处理各种特殊路径情况。 - 处理重命名事件:重命名事件(
Renamed)会同时涉及旧文件名和新文件名,单独判断该事件类型,把新旧文件名都记录到日志中,避免信息缺失。 - 规范CSV写入:放弃手动拼接字符串的方式,改用
Export-Csvcmdlet写入日志,自动处理CSV的格式规则(比如文件名含逗号时自动添加引号),避免出现格式错误。
内容的提问来源于stack exchange,提问作者Rodrigo Lunardelli
相关产品推荐
相关产品推荐

