我一直在寻找一段时间,似乎无法理解为什么会这样。
我有一个维护文件的脚本。我希望隐藏该文件,但更改文件属性会在尝试覆盖它时导致权限问题。
设置是这样的:
"Test Text" | Out-file 'C:\Test\Test.txt' -Force
Set-ItemProperty 'C:\Test\Test.txt' -name Attributes -Value "Hidden"
现在,如果我尝试覆盖它,我会收到以下错误:
"New Text" | Out-file 'C:\Test\Test.txt' -Force
Out-file:拒绝访问路径'C:\ Test \ Test.txt'。在行:1 char:15 +“测试文字”|输出文件'C:\ Test \ Test.txt'-Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:OpenError:(:) [Out-File],UnauthorizedAccessException + FullyQualifiedErrorId:FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand
但权限似乎不是问题,因为我可以获取内容,我可以正常删除文件。
Get-Content 'C:\Test\Test.txt'
rm 'C:\Test\Test.txt' -force
解决方法是删除文件然后编写我的新文件,但我更愿意维护现有文件,如果可能的话只添加它。
答案 0 :(得分:4)
必须删除隐藏文件,然后才能像Out-File
那样“覆盖”它们(没有-Append
参数)。 Add-Content
和Set-Content
通过修改现有文件的内容而不覆盖它来解决此问题。请参阅docs on the FileMode.Create枚举值。
答案 1 :(得分:3)
Keith提供了一个解释权限问题的链接。以下是我对当前问题的解决方案
由于需要维护原始文件的创建日期,我使用的解决方法是取消隐藏文件,写入文件,然后将其重新设置为隐藏。
Set-ItemProperty 'C:\Test\Test.xml' -name Attributes -Value "Normal"
$myobject | Export-CliXml 'C:\Test\Test.xml' -Force
Set-ItemProperty 'C:\Test\Test.xml' -name Attributes -Value "Hidden"
答案 2 :(得分:2)
我不确定为什么Out-File会出现这个错误 - 它也适用于我。但是,Set-Content和Add-Content都可以在我的系统上使用-Force参数正确运行:
"New Text" | Add-Content C:\test\Test.txt -Force
或
"New Text" | Set-Content C:\test\Test.txt -Force
编辑补充:我很好奇Out-File和Set-Content之间的区别,并发现了这个:
Powershell set-content and out-file what is the difference?
它仍然没有完全解释写入隐藏文件的区别,但如果您正在尝试决定使用哪个文件,则可能会感兴趣。