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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:12:41