PowerShell技术问题:如何将变量存储至目录并在For命令中调用,同时实现变量持久化
解决你的PowerShell脚本两大问题:目录调用与变量持久化
嘿,作为PowerShell新手碰到这些问题太正常了,我来帮你一步步拆解并解决!
问题1:无法正确调用E:\temp目录并获取计数
你原脚本里的这行语法有明显错误:
gci -Recurse -Path E:\temp | Measure-Object.Count
Measure-Object是独立的cmdlet,要获取它的Count属性,必须用括号把整个Measure操作的结果包裹起来- 你没有把计数结果赋值给
$Num,导致后续循环的变量根本没有初始值,自然无法运行
正确的写法应该是:
$Num = (Get-ChildItem -Recurse -Path E:\temp | Measure-Object).Count
(注:gci是Get-ChildItem的别名,新手用全名更易理解)
问题2:让$Num变量在脚本运行后保持状态
PowerShell的会话变量在脚本结束后会自动销毁,要持久化变量值,最简单的方法是把它存到本地文本文件里:
- 脚本启动时,检查存储变量的文件(比如
E:\temp\NumCounter.txt)是否存在 - 如果存在就读取里面的数值作为
$Num初始值;如果不存在,就用E:\temp的文件计数初始化 - 脚本每次循环结束后,把更新后的
$Num写回文件,确保下次运行能读取到最新值
修正后的完整脚本
# 定义存储计数的文件路径 $counterFile = "E:\temp\NumCounter.txt" # 初始化$Num变量:读取已有值或设为目录文件数 if (Test-Path $counterFile) { $Num = [int](Get-Content $counterFile) } else { $Num = (Get-ChildItem -Recurse -Path E:\temp | Measure-Object).Count } # 循环逻辑:从当前计数开始,直到超过300 while ($Num -le 300) { # 执行执行策略设置(需管理员权限) Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force Start-Sleep -Seconds 5 # 安装指定版本的AutoPilot脚本,自动确认 Install-Script -Name Get-WindowsAutoPilotInfo -RequiredVersion 3.5 -Force Start-Sleep -Seconds 5 # 导出AutoPilot信息到唯一命名的文件 Get-WindowsAutoPilotInfo.ps1 | Out-File -FilePath "E:\temp\kpf-Laptop$Num.txt" -NoClobber Write-Host "当前计数:$Num" # 计数递增并持久化到文件 $Num++ $Num | Set-Content $counterFile # 可选:循环间隔延迟 Start-Sleep -Seconds 5 }
额外关键提醒
Set-ExecutionPolicy需要管理员权限才能执行,否则会报错- 原脚本里的
Write-Output 命令只是输出字符串,不会真正执行命令,我已改成直接执行 - 移除了原脚本里的
Exit,否则第一次循环就会终止整个脚本
内容的提问来源于stack exchange,提问作者Vilestorm
相关产品推荐
相关产品推荐

