使用路径中的特殊字符将批处理文件转换为powershell

时间:2013-02-17 00:29:56

标签: batch-file powershell-v2.0 command-line-arguments

我很难将一个简单的批处理文件写成powershell脚本。

考虑这个文件夹结构。请注意其中包含酷[1]的目录... enter image description here

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

3 个答案:

答案 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`" "

enter image description here

注意:

  • 这样所有的pathes都可以包含特殊字符,如[和]或空格
  • " `"$exe中的额外空间非常重要。没有它,它将无法运作。

使用set-contentOut-File(“>”是别名)和[io.file]::WriteAllBytes的常规Powershell方式都不能与exiftool.exe实用程序一起使用。对我来说这是一个奇迹。