2014-02-03 3 views
1

После нескольких дней одного шага вперед и в два шага назад я все еще пытаюсь получить вывод одной команды и присваивать переменные значения различным значениям. Из PS строки, я могу создать файл XML, а затем успешно анализировать данные с помощью:Powershell - синтаксис IEX

MediaInfo.exe --output=XML <path-to-file> >> .\info_out.xml 
$xml = [xml](Get-Content .\info_out.xml) 

$xml.Mediainfo.File.track[1] 

$xml.Mediainfo.File.track[1].Duration --> 5mn 0s 
$xml.Mediainfo.File.track[1].Format --> MPEG Video 
$xml.Mediainfo.File.track[1].Format_profile --> 4:2:[email protected] 

Теперь моя проблема при попытке вызвать --output = XML переключатель MediaInfo с IEX или &. Я бы предпочел не писать XML в файл каждый раз и в идеале хотел бы использовать функцию xml без необходимости писать/читать/очищать время XML-файла каждый раз.

Вот пример того, что я делаю:

## Gather file info with MediaInfo (CLI) as XML 
$tool = "C:\Program` Files\MediaInfoCLI\MediaInfo.exe" 
$xmlswitch = "--Output=XML" 
$Args = @("$tool", "$xmlswitch", "$filename") 

write-host "`n .............Testing.............. `n" 
Write-Host "Executable: $tool" 
Write-Host "XML switch: $xmlswitch" 
Write-Host "Filename: $filename" 
Write-Host "Args: $Args `n `n" 

$test = IEX $tool $xmlswitch $filename 
write-host $test 
$test2 = IEX $Args 
write-host $test2 

exit 0 

$ тест дает:

Invoke-Expression: Позиционный параметр не может быть найден, который принимает аргумент «-> Output = XML ». В C: \ Program Files \ GXFunpack \ Bin \ mediainfo.v02.ps1: 52 символ: 12 + $ тест = IEX < < < < $ инструмент $ xmlswitch $ имя_файла + CategoryInfo: InvalidArgument: (:) [Invoke- Выражение], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell.Commands.InvokeExpressionCommand

$ test2 дает:

Invoke-Expression: Невозможно преобразовать 'System.Object [] к type 'System.String', требуемый параметром 'Command'. Указанный метод не поддерживается. В C: \ Program Files \ GXFunpack \ Bin \ mediainfo.v02.ps1: 54 символ: 13 + $ test2 = IEX < < < < $ Args + CategoryInfo: InvalidArgument: (:) [Invoke-Expression], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgument, Microsoft.PowerShell.Commands.InvokeExpressionCommand

Я попытался так много вариаций и отклонений синтаксиса:

  • $ инструмент = «C: \ Program Files \ MediaInfoCLI \ MediaInfo.exe "
  • $ инструмент = C: \ "Program Files" \ MediaInfoCLI \ MediaInfo.exe
  • IEX "$ инструмент $ xmlswitch $ имя_файла"
  • "` -`-выход = XML"
  • и многое, многое другое ...

Но каждый раз, когда он просто плюет назад на следующую загадочную ошибку.

Может ли кто-нибудь показать мне ошибки моего пути, пожалуйста?

+0

Первый неудачный, потому что вы проходите в трех строках, когда он хочет его. Второе не получается, потому что вы передаете 1 массив, когда он хочет строку. что происходит, когда вы запускаете '$ test = Invoke-Expression '$ tool $ xmlswitch $ filename" '? – Cole9350

ответ

1

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

[xml]$xml = (MediaInfo.exe --output=XML <path-to-file>) 

Это должно запустить команду и собирать выход в переменную $xml.

2

Возможно, вам просто нужен оператор вызова вызова '&'. Вам определенно не требуется Invoke-Expression.

Try:

$test = & $tool $xmlswitch $filename 

См http://blogs.msdn.com/b/powershell/archive/2011/06/03/invoke-expression-considered-harmful.aspx для получения дополнительной информации о том, почему вы должны избегать Invoke-Expression.

+0

Хорошая ссылка, с уважением, сэр, спасибо. – yaquaholic

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