PowerShell脚本运行正常但无法生成日志文件问题排查求助
问题排查&修复方案
核心问题1:路径拼接错误
你当前的$path变量获取后末尾没有带反斜杠,直接拼接文件名会生成非法路径:
比如Split-Path -parent "\\srv02file\Public\Information Technology\IT Reports\*.*"返回的结果是\\srv02file\Public\Information Technology\IT Reports,直接拼接后得到的$LogFile会变成\\srv02file\Public\Information Technology\IT ReportsRemove_Formatting_202405201030.log,路径不存在自然无法创建文件。
修复方法推荐用更稳妥的PowerShell内置Join-Path命令,自动处理路径分隔符:$LogFile = Join-Path -Path $path -ChildPath "Remove_Formatting_$LogDate.log"
核心问题2:Split-Path参数冗余
你给Split-Path传的路径带了*.*通配符,没有必要,直接传入目标目录路径即可,避免产生不可预期的结果:
修改为:$path = Split-Path -parent "\\srv02file\Public\Information Technology\IT Reports\"
其他可能的问题
- 变量作用域问题:如果
LogWrite函数调用时识别不到外部定义的$LogFile变量,可以在函数内显式指定作用域,把Add-Content $LogFile -Value $Line改成Add-Content $script:LogFile -Value $Line - 权限验证:确认运行脚本的账户对
\\srv02file\Public\Information Technology\IT Reports目录有写入权限 - 提前创建文件:可以在定义完
$LogFile之后加一行New-Item -Path $LogFile -ItemType File -Force,强制创建空日志文件,提前捕获路径/权限问题
修复后完整参考代码
# 正确获取父路径 $path = Split-Path -parent "\\srv02file\Public\Information Technology\IT Reports\" $LogDate = Get-Date -f yyyyMMddhhmm # 用Join-Path安全拼接路径 $LogFile = Join-Path -Path $path -ChildPath "Remove_Formatting_$LogDate.log" # 强制创建日志文件,提前捕获路径/权限问题 New-Item -Path $LogFile -ItemType File -Force | Out-Null Function LogWrite { [CmdletBinding()] Param ( [Parameter(Mandatory=$False)] [ValidateSet("INFO","WARN","ERROR","FATAL","DEBUG")] [String] $Level = "INFO", [Parameter(Mandatory=$True)] [string] $Message ) $Stamp = (Get-Date).toString("hh:mm:ss") $Line = "$Stamp $Level $Message" # 显式指定脚本作用域的LogFile变量,避免作用域问题 Add-Content $script:LogFile -Value $Line Write-Output $Line }
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

