我是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...
我在哪里错了?
答案 0 :(得分:1)
试试这个:
foreach($file in $foundJpg) {
$File | Rename-Item -NewName { $_.Name.replace("thumbnail", "SAFE-thumbnail.jpg") }
#Do other stuff...
}
您需要使用$file
作为命令的输入(您应该可以通过管道执行此操作,如上所示),因为这是您的ForEach
循环用于表示每个项目的内容由Get-ChildItem
检索到$foundJpg
变量。