0

我很难编写一个简单的批处理文件作为 powershell 脚本。

考虑这个文件夹结构。注意里面有cool的目录[1]... 在此处输入图像描述

exiftool.exe
是一个命令实用程序,用于(例如)从嵌入的 MP3 标签中提取图片。如果您需要更多信息,
上传了它的帮助。

oldscript.cmd
exiftool -picture -b input.mp3 > output.jpg
这一行是在powershell中写的。我在作者 的论坛帖子中找到了语法

  • -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”处理路径中的特殊字符。但是我仍然无法将批处理转换为 Powershell 脚本,因为与旧的批处理管道 (">") 相比,Set-Content(以及 Out-File 方法)的工作方式似乎有所不同。无论我使用哪种编码,都无法查看生成的图像。上面的帮助文件说 exiftool 使用的是 UTF8 编码。

当然,我尝试了其他可用的编码,但它们都未能产生可见的图像。我被困在这一点上。所以我最初的问题仍然部分存在“如何将此批处理文件转换为powershell”。

那么为什么在使用旧的批处理命令时它会起作用呢?

例如:创建一个文件夹“D:folder”并将这个带有封面图像的 MP3 文件放入其中。
从上面下载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
4

3 回答 3

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"
于 2013-02-17T08:00:18.800 回答
0

尝试这个:

& $exe -picture -b $input | Out-File -LiteralPath $output

使用 Start-Process 无需使事情复杂化。因为您计算了 exe 的路径并将结果放入字符串中,所以您只需要使用调用运算符&来调用由其后面的字符串命名的命令。

于 2013-02-17T02:03:42.773 回答
0

这是一个解决方法。看来您无法完全避免旧的 cmd.exe。
谢谢应该去@CB

$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(">"的普通 Powershell 方式是一个别名)并且[io.file]::WriteAllBytes都不适用于 exiftool.exe 实用程序。对我来说这是一个奇迹。

于 2013-02-17T18:42:32.890 回答