PowerShell脚本循环条件内Write-Verbose消息无法显示的问题求助
问题排查与修复:PowerShell循环中Write-Verbose无输出
你的问题核心不是Write-Verbose本身的问题,而是循环的逻辑错误导致代码根本没有进入循环体执行——也就是说那些Write-Verbose语句从来没被触发过,自然看不到输出。我帮你拆解一下问题并修复:
1. 外层for循环的终止条件错误
你写的外层循环:
for ($i = $listOfItems.Length - 1; $i -eq 0; $i--) {
这个循环的终止条件是$i -eq 0,只有当$i等于0的时候循环才会继续执行,但初始值$i是$listOfItems.Length - 1(比如如果有5个文件,$i初始是4),第一次判断就不满足$i -eq 0,循环直接跳过了。
正确的终止条件应该是$i -ge 0(适配冒泡排序的外层循环逻辑,从最后一个元素递减到第一个):
for ($i = $listOfItems.Length - 1; $i -ge 0; $i--) {
2. 内层for循环的条件错误
内层循环你写了:
for ($j = 0; $i -lt $i; $j++) {
这里的条件$i -lt $i永远是false(一个数不可能小于它自己),哪怕外层循环跑起来了,内层循环也根本不会执行。正确的条件应该是$j -lt $i:
for ($j = 0; $j -lt $i; $j++) {
3. 冒泡排序逻辑的小问题
另外你的冒泡排序里,当$listOfItems[$j]."FileSize (MB)" -gt $listOfItems[$j + 1]."FileSize (MB)"时,你只写了continue,这会跳过当前循环的剩余代码,但没有执行交换操作——这会导致排序完全失效。应该把交换逻辑放在这个分支里,或者调整判断逻辑。
修正后的完整脚本
[CmdletBinding()] param() Set-Location "\test folder" $listOfItems = Get-ChildItem | Select-Object -Property Name, Mode, LastWriteTime, @{label = "FileSize (MB)";expression = {$_.Length/1024/1024}} $bufferItem = 0 # 修复外层循环条件 for ($i = $listOfItems.Length - 1; $i -ge 0; $i--) { # 修复内层循环条件 for ($j = 0; $j -lt $i; $j++) { if ($listOfItems[$j]."FileSize (MB)" -gt $listOfItems[$j + 1]."FileSize (MB)") { Write-Verbose -Message "交换第$j个和第$($j+1)个元素(前者文件更大)" $bufferItem = $listOfItems[$j] $listOfItems[$j] = $listOfItems[$j + 1] $listOfItems[$j + 1] = $bufferItem } else { Write-Verbose -Message "第$j个元素文件大小小于等于第$($j+1)个,无需交换" } } Write-Verbose -Message "完成第$i轮排序" } # 可选:输出最终排序结果 $listOfItems
验证方法
现在你用-Verbose参数运行脚本:
.\你的脚本文件名.ps1 -Verbose
就能看到循环内部的所有Verbose消息了——因为循环逻辑已经正确,代码会进入循环体执行那些Write-Verbose语句。
内容的提问来源于stack exchange,提问作者Karimka
相关产品推荐
相关产品推荐

