如何递归目录循环,匹配文件名和操纵文件

时间:2017-09-08 10:18:18

标签: powershell recursion

我是Powershell新手,所以对任何错误的术语表示歉意。我已经看过SE了,我知道如何以递归的方式进入目录结构,但是我能找到的所有工作示例似乎都在管道Get-ChildItem的输出,我无法理解如何进一步工作在循环迭代之前使用该文件。

我正在尝试做什么

  • 为我的脚本提供一个目录:C:\Users\Donglecow\myPictures\
  • 递归遍历已定义目录中的所有目录(我有一个广泛的文件结构)。
  • 查找与过滤器thumbnail*.jpg匹配的所有文件,EG:thumbnail_001.jpg
  • 将文件重命名为BACKUP-thumbnail*.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("thumbnail", "SAFE-thumbnail.jpg") }

Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no
input. A script block cannot be evaluated without input.
At C:\Users\Donglecow\myPictures\med.ps1:9 char:23
+ ... -Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") }
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [Rename-Item], ParameterBindingException
    + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.RenameItemCommand

我已经扣除了这可能是因为我试图适应管道输出的命令,如this问题的答案所示:

Get-ChildItem -Recurse -Filter *.mp3 | Rename-Item –NewName { $_.name –replace '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...

我在哪里错了?

1 个答案:

答案 0 :(得分:1)

试试这个:

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

您需要使用$file作为命令的输入(您应该可以通过管道执行此操作,如上所示),因为这是您的ForEach循环用于表示每个项目的内容由Get-ChildItem检索到$foundJpg变量。