![Powershell 脚本用于通过 exe 参数处理 png,同时保持源文件结构](https://linux22.com/image/1516687/Powershell%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E9%80%9A%E8%BF%87%20exe%20%E5%8F%82%E6%95%B0%E5%A4%84%E7%90%86%20png%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%9D%E6%8C%81%E6%BA%90%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84.png)
我目前正在做一个个人项目,需要调整数万个 png 文件的大小。我对脚本、PS 或编程知之甚少(我是一名平面设计师)
我正在使用一款名为图片调整器调整图像大小。
该软件有命令行参数。我使用的参数是:
/resize auto "XBR 2x <NoBlend>"
它获取我的图像并使用 xBRx2 算法将其大小加倍。这是我需要的输出。
事实上,我从软件的 Github 上抓取了一个批处理文件,它完全符合我的要求,但只针对单个图像。这就是它,供参考:
@echo off
for %%F in (Input*.*) do ImageResizer-r129.exe /load "%%F" /resize auto "XBR 2x <NoBlend>" /save "Output\%%~nF%%~xF"
这就是我的困境。正如我提到的,我有数以万计的此类图像。你可能会想“好吧,cmd 可以做到这一点”...
除此之外,这些 png 嵌套在相当广泛的子目录布局中......并且我的输出文件夹需要维护与输入相同的子目录布局才能满足我的需要。
因此,为了更清楚地解释我需要什么......
我有一个 INPUT 文件夹。此文件夹中有几个子文件夹。每个文件夹中还有更多文件夹……这些文件夹的范围和名称各不相同。最终,每个“分支”的末尾都是我需要软件处理的 png。
因此,我的输入文件夹看起来有点像这样:
L 输入
L_ 凿子
L__ 纹理
L___ 物品
L____ one.png
L____ two.png
L___ 模型
L____ one.png
L____ two.png
L_ 工件
L__ 纹理
L___ 物品
L____ groupOne
L_____ one.png
L_____ two.png
L____ groupTwo
等
从我的示例中可以看出,没有统一的命名结构,并且从我对脚本的了解来看,需要递归开关来获取所有 png。
此输入文件夹中的所有 PNG 都需要使用我的参数通过 ImageResizer.exe 传递。
然后,处理后的 PNG 需要输出到与输入具有相同子目录布局的输出文件夹...
所以,输入/凿子/纹理/项目/one.png需要/保存到输出/凿子/纹理/项目/one.png对于我的输入文件夹中的每个 png 都执行此类推。
或者,脚本可以直接覆盖输入文件夹中的原始图像。无论哪种方式都可以实现相同的目标。
这是我目前的 PS 脚本,是我姻亲写的,但未能完成。 http://pastebin.com/fveGJkRJ
非常感谢您的帮助,因为我需要像这样处理大约 18,000 个 png。我开始一遍又一遍地复制和粘贴批处理脚本,用每个文件路径替换每个输入和输出,但这浪费了太多时间。
答案1
这是一个可以满足您的要求的 powershell 脚本。
由于我对参数和引用有疑问(而且没有时间),它会为 ImageResizer-r129.exe 生成必要的文件夹和一个包含所有参数的批处理文件,您必须单独执行。
$ImgRes= "ImageResizer-r129.exe"
$Input = "G:\Rebirth Gaming\ImageResizer\input\"
$output= "G:\Rebirth Gaming\ImageResizer\Output\"
$Len = $Input.Length
Set-Location $Input
Get-ChildItem *.png -file -recurse|
ForEach {
$OutPath = $Output+$($_.DirectoryName.Substring($Len))
If (!(Test-Path $OutPath)) {MkDir $OutPath}
"$ImgRes /load `"$_`" /resize auto `"XBR 2x <NoBlend>`" /save `"$OutPath\$($_.Name)`" "
} | Out-File $($Output+"Resize.cmd")