Powershell 如何递归目录循环、匹配文件名和操作文件

Powershell 如何递归目录循环、匹配文件名和操作文件,powershell,recursion,Powershell,Recursion,我是Powershell的新手,因此对于任何错误的术语,我深表歉意。我看过SE,知道如何递归地进入目录结构,但是我能找到的所有工作示例似乎都是通过管道输出Get ChildItem,我不知道如何在循环迭代之前进一步处理文件 我想做的事 为我的脚本提供一个目录:C:\Users\Donglecow\myPictures\ 递归地遍历定义目录中的所有目录(我有一个扩展的文件结构) 查找与筛选器缩略图*.jpg匹配的所有文件,例如:缩略图\u 001.jpg 将文件重命名为备份缩略图*.jpg 检查

我是Powershell的新手,因此对于任何错误的术语,我深表歉意。我看过SE,知道如何递归地进入目录结构,但是我能找到的所有工作示例似乎都是通过管道输出
Get ChildItem
,我不知道如何在循环迭代之前进一步处理文件

我想做的事

  • 为我的脚本提供一个目录:
    C:\Users\Donglecow\myPictures\
  • 递归地遍历定义目录中的所有目录(我有一个扩展的文件结构)
  • 查找与筛选器
    缩略图*.jpg
    匹配的所有文件,例如:
    缩略图\u 001.jpg
  • 将文件重命名为
    备份缩略图*.jpg
  • 检查该图像的尺寸(以像素为单位),并将其打印到命令行
到目前为止我得到了什么

param (
    [string]$dir = $pwd
)
write-output "Working from $($dir)"

$foundJpg = get-childitem -Recurse -Filter thumbnail*.jpg $dir
foreach($file in $foundJpg) {
    write-output "Found $($file)"
    #Rename to Backup...
    #Check image dimensions...
    #Do other stuff...
}
这可以工作并输出正确的文件名,但当我尝试重命名文件时,会出现错误

Rename Item-NewName{$\.Name.replace(“缩略图”、“安全缩略图.jpg”)}

我推断这可能是因为我试图根据一个命令进行调整,该命令将输出管道化,如问题的答案所示:

Get-ChildItem-Recurse-Filter*.mp3 |重命名项–NewName{$\uu.name–替换'xyz','abc'}

然而,我对循环使用了不同的构造,这样我可以进一步与找到的每个文件进行交互

我的环境

下面是我的文件结构的一个片段,仅供参考

C:\Users\Donglecow\myPictures\
1\001\thumbnail_001.jpg
1\002\thumbnail_001.jpg
1\003\thumbnail_001.jpg
2\001\thumbnail_001.jpg
etc...
我哪里出了问题

试试这个:

foreach($file in $foundJpg) {
     $File | Rename-Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") }
     #Do other stuff...
}

您需要使用
$file
作为命令的输入(您应该能够通过如上所示的管道来执行),因为这是
ForEach
循环用来表示
Get ChildItem
检索到的每个项,并将其放入
$foundJpg
变量中。

啊,这是一个简单的解决方案。谢谢我没有意识到鲍威尔的管道就是这样运作的。来自Linux,我认为它在两种平台上的工作原理相同。
foreach($file in $foundJpg) {
     $File | Rename-Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") }
     #Do other stuff...
}