PowerShell脚本Export-CSV报错:文件被其他进程占用求助
问题根源与解决方案
核心问题
你遇到的文件占用错误,本质是**循环内反复调用Export-Csv -Append**导致的。每次执行这个命令时,PowerShell会打开目标CSV文件、写入数据、关闭文件,但在网络共享路径上,文件系统的句柄释放可能存在延迟。当循环速度稍快(哪怕加了Sleep),后续的Export-Csv尝试打开文件时,前一次的文件句柄还没完全释放,就会触发“被另一进程使用”的错误。
另外,你的脚本里有个语法错误:$TF($NativePath)]应该写成$TF[$NativePath],多了个左括号,会导致这一行赋值失败。
修复方案
最可靠的解决方法是先把所有结果对象收集到内存数组中,最后一次性导出CSV,彻底避免反复打开文件的冲突。如果数据量极大(担心内存不足),可以改用StreamWriter手动管理文件句柄,但前者在大多数DFS场景下足够高效。
修正后的脚本
cls $Report = "\\server1\DFSReport" $Date = (Get-Date -format "MMddyyyy") $Tab = [char]9 # 初始化数组存储所有结果对象 $results = @() $Roots = Get-DfsnRoot -Path 'ABC.com\data' ForEach ($Root in $Roots) { Write-Host Write-Host $Tab Enumarating $Root.Path -ForegroundColor Cyan $Dirs = Get-DfsnFolder -Path "$($Root.Path)\*" | Where-Object { ($_.Path -notlike '*.DFSFolderLink*') -and ($_.Path -notlike '*test*') } Write-Host $Tab Found $DIRs.Count Folder Targets -ForegroundColor DarkCyan ForEach ($DIR in $DIRs) { $Targets = Get-DfsnFolderTarget -Path $DIR.Path | Select-Object State, Path, NamespacePath, TargetPath, ReferralPriorityClass, ReferralPriorityRank ForEach ($Target in $Targets) { $TF = @{ $True = 'Accessible' $False = 'NOT Accessible' } $DFSN = Test-Path $Target.NamespacePath Write-Host Write-Host $Tab $Tab Checking DFSN Path - $Target.NamespacePath - $TF[($DFSN)] -ForegroundColor Cyan $NativePath = Test-Path $Target.TargetPath Write-Host $Tab $Tab Checking DFSN Target Path - $Target.TargetPath - $TF[($NativePath)] -ForegroundColor DarkYellow $Prop = [ordered]@{ 'DFS State' = $Target.State 'NamespacePath' = $Target.NamespacePath 'NamespacePath Status' = $TF[$DFSN] 'TargetPath' = $Target.TargetPath 'TargetPath Status' = $TF[$NativePath] # 修复了语法错误 'ReferralPriorityClass' = $Target.ReferralPriorityClass 'ReferralPriorityRank' = $Target.ReferralPriorityRank } $Obj = New-Object -TypeName PSObject -Property $Prop # 将对象添加到结果数组,而不是立即导出 $results += $Obj } } } # 所有数据收集完成后,一次性导出CSV $results | Export-Csv -Path "$Report\DSFN-Report-$Date.csv" -NoTypeInformation -Force
额外说明
- 用数组收集结果后一次性导出,完全避免了多次打开文件的冲突,比加Sleep可靠得多。
-Force参数确保如果文件已存在(比如同一天重复运行脚本),会覆盖旧文件,避免额外的权限或占用问题。- 修复了
$TF($NativePath)]的语法错误,避免运行时出现意外报错。
内容的提问来源于stack exchange,提问作者M0T0
相关产品推荐
相关产品推荐

