我有一个无法正常工作的脚本:
$files = Get-ChildItem "C:\test\"
for ($i=0; $i -lt $files.Count; $i++) {
$outfile = $files[$i].FullName + "out"
Get-Content $files[$i].FullName | ? {$_.Trim() -ne "" } | Set-Content $files[$i].FullName
}
错误是:
Set-Content:该进程无法访问文件'C:\ test \ ADMINISTRATOR.txt', 因为正在使用它 在D:\ skriptablank.ps1:4 char:63 + Get-Content $ files [$ i] .FullName | ?{$ _。Trim()-ne“”} | Set-Content $ files ... + ~~~~~~~~~~~~~~~~~ + + CategoryInfo:未指定:(:) [Set-Content],IOException + FullyQualifiedErrorId:System.IO.IOException ,Microsoft.PowerShell.Commands.SetContentCommand
您怎么看,我在哪里做错了?
您正在使用Get-Content
,并Set-Content
在管道相同的文件:
Get-Content $files[$i].FullName | ... | Set-Content $files[$i].FullName
执行此操作时,通常在Set-Content
开始写入文件时仍会读取该文件,从而导致您观察到错误。您需要先完成阅读,然后才能开始写作:
(Get-Content $files[$i].FullName) | ... | Set-Content $files[$i].FullName
或先写入一个临时文件,然后用临时文件替换原始文件:
Get-Content $files[$i].FullName | ... | Set-Content "$env:TEMP\foo.txt"
Move-Item "$env:TEMP\foo.txt" $files[$i].FullName -Force
对于小型文件,通常希望使用第一种方法,因为将整个文件读入内存而不是逐行读取是更快,更容易处理的。
对于大文件,通常希望使用第二种方法以避免内存耗尽。确保在与要替换的文件相同的文件系统上创建临时文件,因此在移动临时文件时不必再次复制整个数据(在文件系统/卷中移动操作只需更改引用即可)到文件中,这比移动文件内容要快得多)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句