PowerShell脚本追加文件时遇被占用错误的解决方法
解决PowerShell写入文件时的“文件被占用”错误
问题场景
编写PowerShell脚本从JSON文件提取指定数据并追加到.txt文件,执行初始代码时出现大量文件占用错误,导致导出数据截断。
初始代码:
$columns = "ID_Report","Name","Created_by","Last_mod_by" $file = Get-Content -Path "W:\Personal\Ulrich\VA-Scraping\reports.json" -Raw | ConvertFrom-Json $key_first = "items" Write-Output "$($columns[0]);$($columns[1]);$($columns[2]);$($columns[3]);$($columns[4])" > xxx.txt foreach ($record in $file){ if ($record | Select-Object -ExpandProperty $key_first -ErrorAction SilentlyContinue){ foreach ($item in $record.items){ "$($item.id);$($item.name);$($item.createdBy);$($item.modifiedBy)" | Add-Content "W:\Personal\Ulrich\Skriptiky\xxx.txt" } } }
错误信息
Add-Content : The process cannot access the file 'W:\Personal\Ulrich\Skriptiky\xxx.txt' because it is being used by another process. At line:12 char:82 + ... tem.modifiedBy)" | Add-Content "W:\Personal\Ulrich\Skriptiky\xxx.txt" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (W:\Personal\Ulrich\Skriptiky\xxx.txt:String) [Add-Content], IOException + FullyQualifiedErrorId : GetContentWriterIOError,Microsoft.PowerShell.Commands.AddContentCommand
解决方案
调整代码后问题得到解决,优化后的代码如下:
$columns = "ID_Report","Name","Created_by","Last_mod_by" $file = Get-Content -Path "W:\Personal\Ulrich\Skriptiky\VA-Scraping\reports.json" -Raw | ConvertFrom-Json $outfile = "W:\Personal\Ulrich\Skriptiky\VA-Scraping\vystupy\$(Get-Date -f yyyyMMdd).txt" $key_first = "items" Write-Output "$($columns[0]);$($columns[1]);$($columns[2]);$($columns[3]);$($columns[4])" | Out-File -FilePath $outfile $file | ForEach-Object {$_.items } | ForEach-Object {Write-Output "$($_.id);$($_.name);$($_.createdBy);$($_.modifiedBy)"} | Add-Content "$outfile"
优化要点
- 用统一变量
$outfile管理输出路径,避免路径不一致引发的潜在问题 - 改用管道式
ForEach-Object替代嵌套foreach循环,减少文件频繁打开/关闭操作,降低文件被占用的概率 - 输出文件名加入日期戳,避免重复执行时覆盖原有文件
内容的提问来源于stack exchange,提问作者Tomáš Ulrich
相关产品推荐
相关产品推荐

