含方括号路径的PowerShell脚本修改文件内容报错求助
解决PowerShell修改带方括号的隐藏.nfo文件时的路径错误问题
首先,你的错误根源在于手动给文件名添加反引号转义——PowerShell里,当你已经拿到Get-ChildItem返回的FileInfo对象时,完全不需要手动转义方括号这类特殊字符,直接使用对象自带的属性(比如FullName)或者直接传递对象给文件操作命令,PowerShell会自动处理路径中的特殊字符。你手动转义后,脚本试图寻找带反引号的文件名(比如[FileName] Martic.nfo),但实际文件并不存在,所以才会报找不到文件的错误。
下面是修正后的可用脚本:
Get-ChildItem -Hidden -Filter *.nfo | ForEach-Object { $find = '<studio>StudioName</studio>' $replace = '<studio>Studio Name</studio>' # 直接使用FileInfo对象的FullName属性,无需手动转义特殊字符 $content = Get-Content -Path $_.FullName -Raw $updatedContent = $content.Replace($find, $replace) $updatedContent | Set-Content -Path $_.FullName }
关键修改点说明:
- 移除了手动转义文件名的代码:删掉了
$file = $_.Name -replace '\[','[' -replace ']',']'这部分冗余操作,直接用$_.FullName获取完整文件路径,PowerShell会正确解析带方括号的路径。 - 新增
-Raw参数读取文件:一次性读取整个文件内容,比逐行读取更高效,还能避免处理换行符时的潜在问题。 - 拆分操作步骤:把内容读取、替换、写入分开,让脚本逻辑更清晰,也方便后续调试。
另外,考虑到.nfo文件通常是XML格式,更推荐使用PowerShell的XML原生处理能力,这样能避免字符串替换可能带来的格式问题(比如空格、换行导致匹配失败),示例如下:
Get-ChildItem -Hidden -Filter *.nfo | ForEach-Object { $xml = [xml](Get-Content -Path $_.FullName -Raw) $studioNode = $xml.SelectSingleNode('//studio') if ($studioNode) { $studioNode.InnerText = 'Studio Name' $xml.Save($_.FullName) } }
这种方法更安全,能精准定位XML节点修改内容,不会破坏文件的XML结构。
内容的提问来源于stack exchange,提问作者Lalajee




