2013-02-17 2 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
Мой лучший текущий нерабочим код:

$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 method) тоже работает по сравнению со старым пакетным конвейером («>»). Полученное изображение не может быть просмотрено независимо от того, какую кодировку я использую. help file from above говорит, что exiftool использует кодировку UTF8.

Конечно, я пробовал другие available encodings, но все они не смогли создать видимое изображение. Я застрял в этом вопросе. Поэтому мой первоначальный вопрос по-прежнему стоит частично «Как преобразовать этот командный файл в powershell».

Так почему это работает при использовании старой команды партии?

Например: создать папку «D: папка» и поместить в нее 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 

ответ

1

Вы можете попробовать это, хотя я не проверял, потому что я имею не mp3, с внедренными изображениями:

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

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

Edit:

, используя эту строку из консоли 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" 
+0

Протестировано. Дает ошибку 'Невозможно преобразовать аргумент« 1 »со значением:« System.Object [] », для« WriteAllBytes »введите« System.Byte [] »:« Невозможно преобразовать значение »╪ α JFIF █ ä», чтобы ввести «Система .Byte ". Ошибка:« Строка ввода не была в правильном формате ».« Вот вам [пример MP3] (http://ge.tt/4PUs8hY/v/1), если вам нужно его протестировать. – nixda

+0

@nixda Спасибо за mp3. Я нашел альтернативу, добавленный код в свой ответ. –

+0

Закрыть один. Вставьте пробел в "a [1]" »" a [1] ", и это не сработает. Я думаю, что переменные должны быть заключены в двойные кавычки. Но как? – nixda

0

Попробуйте это:

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

Там нет необходимости усложнять с помощью Start-Process.Поскольку вы вычисляете путь к exe и помещаете этот результат в строку, вам нужно использовать оператор вызова & для вызова команды, названной последовавшей за ней строкой.

+1

Вы протестировали это? Потому что Out-File [не понимает -LiteralPath] (http://ss64.com/ps/out-file.html). Даже если я удалю специальный символ '[1]', выходной файл будет создан, но не будет отображаться. Инструмент работает, если вызван из пакета, но не из PS. – nixda

+0

Работает на PowerShell 3.0. http://www.microsoft.com/en-us/download/details.aspx?id=34595 –

+0

См. мое редактирование. Я пошел еще дальше с Set-Content, который имеет буквальный путь и в V2. Но результирующий файл каким-то образом обрабатывается по-разному по сравнению с старыми пакетами окон и трубопроводами с «>» – nixda

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

Примечание:

  • Таким образом, все тракты могут содержать специальные символы, такие как [и] или пробелы
  • Это дополнительное пространство в " `"$exe важен. Без него это не сработает.

Нормальный Powershell путь с set-content, Out-File («>» является псевдонимом) и [io.file]::WriteAllBytes вообще не работают с exiftool.exe утилиты. Для меня это чудо.

Смежные вопросы