PowerShell新手求助:目录遍历及文件/目录识别异常问题
问题分析与修正方案
原代码的问题
- 开头的
#!/bin/bash是Linux Shell脚本的标识,PowerShell不需要,直接删除即可。 - 判断文件/目录的逻辑写在
foreach循环外面,导致循环结束后只处理了最后一个遍历到的项,这就是为什么只有一个文件被标记、目录完全没处理的原因。 Test-Path仅用于检查路径是否存在,无法区分文件和目录,得用PowerShell对象自带的属性来判断类型。cd c:\是多余的,Get-ChildItem已经指定了目标路径,不需要提前切换目录。
修正后的代码
Get-ChildItem -Path C:\ | ForEach-Object { # 通过PSIsContainer属性判断是目录还是文件 $itemType = $_.PSIsContainer ? "Directory" : "Regular File" # 获取完整路径、大小(目录默认Length为0,如需实际占用大小可看下方补充) $fullPath = $_.FullName $size = $_.Length Write-Host "$itemType | 路径: $fullPath | 大小: $size 字节" }
补充说明
- 如果需要显示目录的实际占用大小(而非默认的0字节),可以替换大小部分的代码,但注意大目录会耗时较长:
$size = if ($_.PSIsContainer) { (Get-ChildItem $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum } else { $_.Length } ForEach-Object是PowerShell中管道式的遍历写法,和单独的foreach循环功能一致,但更符合PowerShell的管道风格。$_.FullName确保获取的是完整路径,避免相对路径的问题。
内容的提问来源于stack exchange,提问作者user19967186
相关产品推荐
相关产品推荐

