从txt文件中删除空格和空白行

Stefan0309

我有一个无法正常工作的脚本:

$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

您怎么看,我在哪里做错了?

安斯加·威彻斯(Ansgar Wiechers)

您正在使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章