PowerShell函数传参报错:无法索引空数组问题排查
问题分析与解决
核心错误点
- 参数类型不匹配:函数将
$FldPath定义为[String[]](字符串数组),但调用时传入的是Get-ChildItem -Directory返回的DirectoryInfo对象数组。PowerShell强制转换对象数组为字符串数组时,会把每个文件夹对象转为名称字符串,而非保留对象本身,导致$FldPath不再包含FullName属性,访问$FldPath.FullName得到null,索引时触发"无法索引到空数组"错误。 - 属性访问语法错误:即便参数类型正确,
$FldPath.FullName[$i]的写法也不符合PowerShell数组对象的访问逻辑。正确逻辑是先索引数组元素$FldPath[$i],再访问其FullName属性,即$FldPath[$i].FullName。 - 语法冗余:
$NewFld一行末尾多了一个右括号,属于语法错误。
修正后的代码
修正后的函数
Function RenameFolderFiles{ param( # 改为DirectoryInfo数组类型,匹配传入的对象类型 [System.IO.DirectoryInfo[]]$FldPath, [String]$TypeFld ) Write-Host $TypeFld " : " $FldPath.Length Write-Host $FldPath for ( $i = 0; $i -lt $FldPath.Length; $i++ ) { # 先取数组元素,再访问FullName属性 write-host $i " : " $FldPath[$i].FullName # 移除多余的右括号 $NewFld = ([string]$FldPath[$i].FullName).Replace(" _ tt","") # 可添加实际重命名逻辑,例如: # Rename-Item -Path $FldPath[$i].FullName -NewName $NewFld } }
调用代码(无需修改)
$Fld = Get-ChildItem -Path "$varCheminRepertoireScript" -Recurse -Directory | Where-Object {$_.FullName -like "* _ tt*"} RenameFolderFiles -FldPath $Fld -TypeFld "Nb of Folders & Sub-Folders"
额外说明
如果不需要严格指定参数类型,也可以去掉[System.IO.DirectoryInfo[]]约束,让PowerShell自动推断传入的对象类型,代码依然能正常运行:
param( $FldPath, [String]$TypeFld )
内容的提问来源于stack exchange,提问作者StartingPS
相关产品推荐
相关产品推荐

