首页 > 解决方案 > 在我的 powershell 脚本中添加 -Recurse 选项

问题描述

我有一个作用于单个文件系统项的函数,我想添加递归文件系统作为选项的功能,类似于 Get-ChildItems -Recurse。我读过 GCI 递归在遇到无权读取的目录时会出现问题,引发异常并停止。我想知道最好的方法是什么。

我是不是该;

  1. 将流水线添加到我的函数并执行: gci -Recurse $path | edit-mydetails -Add "my comment"
  2. 在我的函数中添加一个递归开关并实现目录递归,在内部使用 GCI: edit-mydetails -Recurse -Path c:\users\me\Documents\MyProject -Add "My details"

使用这个条件逻辑块;

...
    if ($Recurse) {
        gci -Recurse -Path $Path | % { do-stuff $_.Name }
    } else {
        do-stuff $Path
    }
...
  1. 其他一些更健壮的文件系统遍历方法,使用 System.IO ?

谢谢。

标签: powershell

解决方案


我读过 GCI 递归在遇到无权读取的目录时会出现问题,引发异常并停止。

否:默认情况下,在遍历过程中遇到错误时Get-ChildItem不会停止:它会发出非终止错误并继续

您可以使用 common-ErrorAction参数来修改该行为,特别是在自动变量中收集错误的同时-ErrorAction SilentlyContinue抑制错误显示,完全忽略错误,并在遇到第一个(非终止)错误时停止处理。$Error-ErrorAction Ignore-ErrorAction Stop

此外,您可以使用-ErrorAction <variable-Name>收集指定变量中的所有错误,除非您还指定-ErrorAction Ignore.

我应该:将流水线添加到我的函数中并执行:gci -Recurse $path | edit-mydetails -Add "my comment"

是的,您应该:没有充分的理由复制函数Get-ChildItem [-Recurse]内部的功能。相反,让您的函数[System.IO.FileInfo]通过管道接受输入以及可选的文件系统路径字符串。


推荐阅读