如何将PowerShell对象结果转换为数组,以逐行调用自定义函数
解决方案
你的核心需求是将Get-ChildItem返回的对象集合(每个对象包含FullName属性)转换为字符串数组,从而可以遍历每个路径调用setParameterb函数。这里有几种简洁的实现方式:
方式一:先收集所有路径到字符串数组,再遍历调用
function setParameterb () { $Name = $args[0] "Arg1: $Name" } Write-Output "### Starte AlertlogRotate ###" $folders = @('d:', 'e:', 'f:', 'g:', 'h:', 'i:', 'j:', 'k:', 'l:') # 获取所有alert_*.log的完整路径字符串数组 $filePaths = $folders | ForEach-Object { Get-ChildItem -Path "$_\*\log" -ErrorAction SilentlyContinue -Recurse -Filter alert_*.log | Select-Object -ExpandProperty FullName } # 遍历每个路径调用函数 foreach ($path in $filePaths) { setParameterb $path }
关键改动说明:
- 使用
Select-Object -ExpandProperty FullName代替原代码的Select-Object FullName:前者会直接提取每个文件对象的FullName属性值,输出纯字符串数组;而后者返回的是仅包含FullName属性的对象集合,这也是你之前无法直接用它调用函数的原因。 - 用
ForEach-Object配合管道遍历驱动器列表,比传统foreach循环更符合PowerShell的风格。
方式二:边获取路径边调用函数(更高效)
如果不需要保存所有路径到数组,直接在获取文件时就调用函数,这样内存占用更低,适合处理大量文件的场景:
function setParameterb () { $Name = $args[0] "Arg1: $Name" } Write-Output "### Starte AlertlogRotate ###" $folders = @('d:', 'e:', 'f:', 'g:', 'h:', 'i:', 'j:', 'k:', 'l:') $folders | ForEach-Object { Get-ChildItem -Path "$_\*\log" -ErrorAction SilentlyContinue -Recurse -Filter alert_*.log | ForEach-Object { # 直接访问当前文件对象的FullName属性传入函数 setParameterb $_.FullName } }
这种方式不需要额外的数组存储,每找到一个日志文件就立即调用setParameterb,后续你可以直接在函数里添加压缩逻辑即可。
内容的提问来源于stack exchange,提问作者WalterS777
相关产品推荐
相关产品推荐

