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
相关产品推荐
相关产品推荐

