【问题标题】:Powershell find and replace not recursing through sub-directoriesPowershell查找和替换不通过子目录递归
【发布时间】:2013-10-30 02:44:16
【问题描述】:

我想递归遍历给定文件夹的所有子文件夹,并且对于给定扩展名(可选通配符)的所有文件,搜索并替换一些文本。

以前有一个类似的问题here,我正在尝试让最适合我的目的的最佳答案的修改版本。它使用 Powershell 进行查找和替换。但是,我下面的修改版本不是递归的。我不记得我在哪里找到第一行的recurse 部分,所以也许我使用不正确。

Get-ChildItem *.* -exclude *.ps1* -recurse |
Foreach-Object {
    $c = ($_ | Get-Content) 
    $c = $c -replace 'foo','bar'
    [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}

我正在将 Powershell 命令行中的代码作为 PS 批处理文件 .ps1 运行,因此排除了该扩展名。

如果我直接在包含一些我想要搜索的文件的文件夹中运行它,这很好,但如果我从该文件夹的父文件夹运行它,则不会发生子文件夹的搜索/递归。它甚至没有尝试,我可以从命令立即完成运行的事实中看出这一点。如果我在我的第一个子文件夹中运行它,它有大约 50 个文本文件,在它完成之前会有几秒钟的延迟,这表明它实际上是在搜索这些文件。

我也试过这个,去掉了排除部分,行为是一样的。

【问题讨论】:

  • 如果你从父目录Get-ChildItem *.* -exclude *.ps1* -recurse 运行它,你什么都得不到?我无法重现(在 V4 上)。
  • 刚刚仔细检查。如果我从目录的父目录运行要检查的文件,则不会发生任何事情:Notepad++ 搜索我想要更改的内容前后是相同的。如果我然后从文件夹中运行代码,a) 进行了更改(无法再使用 NPP 找到替换的文本),并且 b) 文件夹中的所有文件都显示更新的修改日期。我不确定我正在运行什么 PS 版本。当我转到 powershell exe 时,我发现它位于 \WindowsPowerShell\v1.0` but if I run $PSVersionTable.psversion` 它告诉我我正在运行 V2.0。有什么想法吗?谢谢。
  • 您正在运行 v2。查看 Get-ChildItem 及其 Exclude 参数的帮助,看看它是否说明了该参数的异常行为。
  • @KeithHill:我也尝试过删除排除部分,即 Get-ChildItem *.* -recurse | 用于我的代码的第一行,并且行为是相同的。
  • 试试Get-ChildItem -recurse -force,以防文件可能被隐藏。

标签: windows powershell


【解决方案1】:

我的猜测是*.* 只匹配其中带有点的项目。文件夹没有扩展名,因此它们不匹配。

gci -rec -force -exclude *.ps1 | 应该做你想做的事。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 2016-10-27
    • 2012-03-12
    • 1970-01-01
    • 2012-04-28
    • 2011-10-23
    • 2023-03-25
    • 2013-05-26
    相关资源
    最近更新 更多