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

PowerShell用户配置文件复制脚本日志$?返回值异常问题

问题原因

  • $?自动变量的取值被后续命令覆盖:执行完Robocopy之后你先运行了New-Item -Path $Path -Force命令,$?会实时更新为上一条命令的执行结果,你读取$?的时候拿到的已经不是Robocopy的执行结果,而是New-Item的执行结果。首次运行时日志文件不存在,New-Item创建文件成功返回$true,所以第一条日志是True;后续运行时文件已存在,-Force参数下New-Item不会重复创建,操作状态判定为非成功,所以$?返回False。
  • Robocopy的退出码规则和PowerShell默认判定逻辑不兼容:Robocopy的退出码范围是0-16,其中0到8都属于正常执行状态(0代表无文件需要复制、1代表复制成功、2代表有文件被删除等),只有退出码≥8时才代表真的出现复制错误。但PowerShell对外部命令的判定逻辑是只要退出码不等于0,就会将$?设为False,所以哪怕Robocopy复制成功,只要有文件被操作(退出码≠0),$?也会返回False。

解决方法

调整命令顺序,同时改用$LASTEXITCODE变量判断Robocopy的执行结果即可,修改后的代码参考如下:

Foreach ($User in $Users){
    Foreach ($TargetDirectory in $Directories){            
        $TestPath = Test-Path -Path "\\$Client\Users\$User"
        If ($TestPath -eq $True) {   
            # 提前创建日志路径,避免覆盖Robocopy的状态变量
            $Date = get-date -f yyyy-MM-dd
            $Path = "C:\Logs\($Date)Sauvegarde_Profils_$Client.txt"
            New-Item -Path $Path -Force
            
            # 执行Robocopy
            Robocopy "\\$Client\Users\$User\$TargetDirectory" "C:\SAV\$Client\$User\$TargetDirectory" /E /MIR
            
            # 用$LASTEXITCODE判断Robocopy执行结果,小于8均属于正常执行
            $CopySuccess = $LASTEXITCODE -lt 8
            $Result = "Copie du dossier $TargetDirectory, appartenant à $User = $CopySuccess dans $Client"
            Add-Content -Path $Path $Result
        }
    }
}

内容的提问来源于stack exchange,提问作者Crysos Is back

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:06:03