You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:19:52