如何在PowerShell中创建基于文件夹大小与文件数的循环适配Intune部署
Intune + PowerShell 解决Autodesk安装包下载检测问题
问题背景
通过Intune部署PowerShell脚本,执行Autodesk官网的Revit 2023下载程序,需下载总计15.2GB、共7932个文件到路径C:\Autodesk\{E658F785-6D4D-4B7F-9BEB-C33C8E0027FA}。下载完成后需创建标记文件告知Intune,供后续脚本清理安装文件。
当前遇到的问题:
- 原脚本使用
Start-Process的-Wait参数时,会导致Intune挂起,必须重启Windows才能恢复 - 去掉
-Wait参数后,脚本会提前执行后续步骤,Intune误判下载完成,导致后续安装流程失败
解决方案
修改脚本,启动下载进程后不等待,改为循环检测目标文件夹的文件数量和总大小,当同时满足两个阈值条件时,再创建完成标记文件。
修改后的PowerShell脚本
# 启动下载进程,不等待进程结束 Start-Process -NoNewWindow -FilePath "\\arch-syd-fs\EM Setup\Autodesk Recap Custom Install 2023\Source 1 Download\Revit_2023.exe" -ArgumentList "--quiet" # 定义目标文件夹路径 $targetFolder = "C:\Autodesk\{E658F785-6D4D-4B7F-9BEB-C33C8E0027FA}" # 设定检测阈值:文件数7932,大小15.2GB(转换为字节:15.2 * 1024^3 ≈ 16329646080) $targetFileCount = 7932 $targetSizeBytes = 15.2 * 1024 * 1024 * 1024 # 循环检测文件夹状态 do { # 等待30秒后再检测,避免资源占用过高 Start-Sleep -Seconds 30 # 获取文件夹内所有文件(包含子文件夹) $files = Get-ChildItem -Path $targetFolder -File -Recurse -ErrorAction SilentlyContinue # 计算当前文件数和总大小 $currentFileCount = if ($files) { $files.Count } else { 0 } $currentSizeBytes = if ($files) { ($files | Measure-Object -Property Length -Sum).Sum } else { 0 } # 输出当前检测状态(可选,用于调试) Write-Host "当前文件数:$currentFileCount,当前大小:$([math]::Round($currentSizeBytes/1GB,2))GB" } while ($currentFileCount -ne $targetFileCount -or $currentSizeBytes -lt $targetSizeBytes) # 满足条件后创建标记文件 $tempDir = "C:\Temp\Revit 2023" if (-not (Test-Path -Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory -Force | Out-Null } New-Item -Path "$tempDir\Download Done.txt" -ItemType File -Force | Out-Null
脚本说明
- 启动下载进程:去掉
-Wait参数,避免Intune挂起,让下载进程在后台运行 - 循环检测逻辑:
- 每30秒检测一次目标文件夹,可根据实际情况调整等待时长
- 捕获文件夹内所有文件(含子文件夹),统计数量和总大小
- 当文件数等于7932且总大小达到15.2GB时,退出循环
- 创建标记文件:确保目标目录存在后,生成完成标记文件,告知Intune下载已完成
内容的提问来源于stack exchange,提问作者brendan smith
相关产品推荐
相关产品推荐

