2013-02-17 75 views
0

我很难写一个简单的批处理文件作为PowerShell脚本。将批处理文件转换为具有路径中特殊字符的PowerShell

考虑这个文件夹结构。请注意目录与它的凉爽[1] ... enter image description here

exiftool.exe
是一个命令实用程序(例如)从嵌入MP3标签中提取的照片。
I uploaded its help如果您需要更多信息。

oldscript.cmd
exiftool -picture -b input.mp3 > output.jpg
这条线是在的powershell写的一个。我发现一个forum post语法从笔者

  • -picture代表标签提取和-b代表二进制模式
  • input.mp3是我测试的MP3可以包含在这样的路径中的特殊字符[和]
  • > output.jpg定义了名称,并在同一文件夹

newscript.ps1 012保存所得到的图像 我目前最好的非工作代码为:

$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:文件夹”,并将其放置在其中。
从上面下载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 

回答

1

你可以试试这个,虽然我没有测试它,因为我还没有与嵌入图像的MP3:使用从PowerShell控制台回报这条线

$file = & "D:\folder\exiftool.exe" -picture -binary "D:\folder\input.mp3" 

[io.file]::WriteAllBytes('D:\folder\input[1].jpg',$file) 

编辑可读的图像:

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" 
+0

经过测试。给“WriteAllBytes”键入“System.Byte []”提供错误“无法转换参数1”,值为“System.Object []”:“无法转换值”“键入”System .Byte“。错误:”输入字符串格式不正确。“”'如果您需要测试,请使用[示例MP3](http://ge.tt/4PUs8hY/v/1)。 – nixda 2013-02-17 13:27:01

+0

@nixda谢谢你的mp3例子。我找到了一个替代方案,在我的答案中添加了代码。 – 2013-02-17 15:54:51

+0

关闭一个。在“a [1]”»“a [1]”中插入一个空格,它将不起作用。我想这些变量需要用双引号括起来。但是如何? – nixda 2013-02-17 17:04:59

0

试试这个:

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

没有必要使用开始处理使事情变得复杂。因为您计算exe的路径并将结果放入字符串中,所以只需使用调用运算符&来调用由它后面的字符串命名的命令。

+1

你测试过了吗?因为Out-File [不理解-LiteralPath](http://ss64.com/ps/out-file.html)。即使删除特殊字符'[1]',输出文件也会被创建但不可见。如果从批处理调用该工具,但不从PS调用该工具。 – nixda 2013-02-17 02:48:59

+0

它适用于PowerShell 3.0。 http://www.microsoft.com/en-us/download/details.aspx?id=34595 – 2013-02-17 03:09:44

+0

请参阅我的编辑。我更进一步,在V2中也有字面路径的Set-Content。但生成的文件与旧窗口批处理和管道有所不同,与“>” – nixda 2013-02-17 05:17:50

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

enter image description here

注:

  • 这样,所有pathes可以包含特殊字符,如[和]或空格
  • ,在额外的空间" `"$exe很重要。没有它,它就无法工作。

正常Powershell的方式与set-contentOut-File( “>” 是一个别名)和[io.file]::WriteAllBytes所有不与exiftool.exe实用的工作。对我来说这是一个奇迹。

相关问题