我很难将一个简单的批处理文件写成powershell脚本。
考虑这个文件夹结构。请注意其中包含酷[1]
的目录...
exiftool.exe
是一个命令工具(例如)从嵌入的MP3标签中提取图片
如果您需要更多信息,我uploaded its help。
oldscript.cmd
exiftool -picture -b input.mp3 > output.jpg
这行是在PowerShell中编写的。我在作者的forum post中找到了语法
-picture
代表要提取的标记,-b
代表二进制模式input.mp3
是我的测试mp3,其路径中可以包含特殊字符,如[和] > output.jpg
定义名称并将生成的图像保存在同一文件夹中 newscript.ps1
我目前最好的非工作代码是:
$ownpath = Split-Path $MyInvocation.MyCommand.Path
$exe = $ownpath + '\exiftool.exe'
$input = $ownpath + '\input.mp3'
$outimg = $ownpath + '\output.jpg'
& $exe -picture -binary $input| Set-Content -literalPath $outimg -encoding UTF8
我发现Set-Content
能够通过“-literalpath”处理pathes中的特殊字符。但我仍然无法将批量转换为Powershell脚本,因为
与旧批量管道(“>”)相比,Set-Content(和Out-File方法)似乎工作不同。无论我使用哪种编码,都无法查看生成的图像。 help file from above表示exiftool正在使用UTF8编码。
当然我尝试了其他available encodings,但所有这些都无法生成可见图像。我陷入了困境。所以我的初步问题仍然部分是“如何将此批处理文件转换为powershell”。
那么为什么在使用旧的批处理命令时它会起作用?
例如:创建一个文件夹“D:folder”并将此MP3 file with a cover image放入其中 从上面下载exiftool.exe并将其放在那里。
旧的批处理命令将起作用并为您提供可视图像
D:\folder\exiftool -picture -binary D:\folder\input.mp3 > D:\folder\output.jpg
具有相同语法的新Powershell V2脚本将失败。为什么?
& D:\folder\exiftool.exe -picture -binary D:\folder\input.mp3 > D:\folder\output.jpg
答案 0 :(得分:1)
你可以尝试这个,虽然我没有测试它,因为我没有嵌入图像的mp3:
$file = & "D:\folder\exiftool.exe" -picture -binary "D:\folder\input.mp3"
[io.file]::WriteAllBytes('D:\folder\input[1].jpg',$file)
编辑:
在powershell控制台中使用此行返回可读图像:
cmd.exe /c "D:\folder\exiftool.exe -picture -binary `"D:\folder\input.mp3`" > image.jpg"
您可以在路径和文件名中使用特殊字符:
$exe = "c:\ps\exiftool.exe"
$mp3 = "c:\ps\a[1]\input.mp3"
$jpg = " c:\ps\a[1]\image[1].jpg"
cmd.exe /c "$exe -picture -binary $mp3 > $jpg"
路径中有空格:
$exe = "c:\ps\exiftool.exe"
$mp3 = "`"c:\ps\a [1]\input.mp3`""
$jpg = "`"c:\ps\a [1]\image [1].jpg`""
cmd.exe /c "$exe -picture -binary $mp3 > $jpg"
答案 1 :(得分:0)
试试这个:
& $exe -picture -b $input | Out-File -LiteralPath $output
使用Start-Process无需复杂化。因为您计算了exe的路径并将该结果放在一个字符串中,所以您只需要使用调用操作符&
来调用由其后面的字符串命名的命令。
答案 2 :(得分:0)
这是一个解决方法。看来你完全无法避免好旧的cmd.exe 谢谢你应该去@ C.B.
$ownpath = Split-Path $MyInvocation.MyCommand.Path
$exe = $ownpath + '\exiftool.exe'
$input = $ownpath + '\input.mp3'
$output = $ownpath + '\output.jpg'
cmd.exe /c " `"$exe`" -picture -binary `"$input`" > `"$output`" "
注意:
" `"$exe
中的额外空间非常重要。没有它,它将无法运作。使用set-content
,Out-File
(“>”是别名)和[io.file]::WriteAllBytes
的常规Powershell方式都不能与exiftool.exe实用程序一起使用。对我来说这是一个奇迹。