【发布时间】: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