PowerShell脚本Get-Content路径异常报错,如何排查修复?
修复PowerShell脚本中的路径错误:Cannot find path...
我一眼就看出问题出在你的Get-ScriptDirectory函数上——它最后错误地返回了$Invocation对象,而不是你前面逻辑计算出的脚本目录路径!
问题根源分析
当你执行$cwd = Get-ScriptDirectory时,你以为拿到的是字符串格式的路径,但实际上函数最后一行的return $Invocation覆盖了前面分支返回的路径值,导致$cwd变成了一个System.Management.Automation.InvocationInfo对象。当Join-Path尝试把这个对象和文件名拼接时,PowerShell会自动将对象转换为它的类型名字符串,这就出现了错误信息里的奇怪路径:H:\System.Management.Automation.InvocationInfo\before.txt。
修复后的脚本函数
只需要删掉函数里多余的return $Invocation即可,让函数返回前面分支计算出的正确路径:
function Get-ScriptDirectory { $Invocation = (Get-Variable MyInvocation -Scope 1).Value; if($Invocation.PSScriptRoot) { $Invocation.PSScriptRoot; } Elseif($Invocation.MyCommand.Path) { Split-Path $Invocation.MyCommand.Path } else { $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\")); } # 移除多余的return $Invocation,让函数返回路径字符串 }
修复后你可以先单独运行Get-ScriptDirectory验证,它应该返回C:\Users\me\Documents\subdir这样的字符串路径,而非对象。此时Join-Path就能正确生成before.txt的完整路径,Get-Content也就不会报错了。
后续:子目录文件列表写入HTML的思路
完成路径修复后,你可以用Get-ChildItem遍历子目录文件,生成对应的HTML元素并追加到目标文件中,示例代码如下:
# 遍历子目录下的所有文件,生成HTML列表项 $fileListHtml = Get-ChildItem -Path $cwd -Recurse -File | ForEach-Object { # 生成带链接的列表项,可根据需求调整格式 "<li><a href='$($_.FullName)'>$($_.Name)</a></li>" } # 将文件列表追加到HTML文件中 Add-Content -Path $filenamePathOut -Value "<h3>子目录文件列表</h3><ul>$($fileListHtml -join '')</ul>" # 最后追加after.txt的内容 Get-Content -Path (Join-Path $cwd $filenameAfter) | Add-Content -Path $filenamePathOut
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

