2015-12-08 2 views
0

В настоящее время я столкнулся с проблемой Bobby Tables болота, но среда - это Chef + Ruby + powershell.Как избежать аргументов команды powershell при вызове из Ruby/Chef?

Все solutionsI've seen пока что неадекватны: они окружают аргументы кавычками, но не полностью избегают аргументов. Shellwords и shellescape выглядят многообещающими, но они кажутся специфичными для bash.

Например, я могу хотеть построить в Chef этого окно командной оболочки:

.\foo.exe BAR="#{node['baz']}" 

Обобщая из SQL Дева мира я наивно предугадывать интерфейсное что-то вроде этого:

cmd = "foo.exe BAR=?" 
args = (node['baz']) 
run-command(cmd, args) 

Где run-command справится с любыми аргументами. Вместо этого я вижу интерфейсы, которые напоминают мне о плохих старых SQL-днях, когда разработчикам приходилось строить SQL как строку и избегать любых аргументов «вручную».

Любые указания на лучшие практики о том, как действовать? Использовать system? Благодаря!

Редактировать: чтобы быть ясным, можно предположить, что аргумент baz включает произвольный текст, включая, возможно, любую комбинацию символов. Подумайте об этом как о идентичном задаче Bobby Tables.

+0

Скорее всего, вам не нужно слишком стараться. Посмотрите, поможет ли вам эта статья (http://windowsitpro.com/powershell/running-executables-powershell). –

+0

Спасибо за ссылку @Bill_Stewart. К сожалению, эта статья, по-видимому, полностью касается пробелов в аргументах, и ее решение состоит в том, чтобы заключить их в двойные кавычки. – jotr

+0

Вы можете использовать утилиту командной строки 'showargs.exe' в загрузке, чтобы увидеть фактическую командную строку, которую создает PowerShell. –

ответ

1

Простейшим общим решением является использование формы массива для свойства execute ресурса command. Это позволяет избежать всех разборок синтаксиса, выполняемых командой verbatim.

execute 'whatever' do 
    command ['foo.exe', "BAR=#{node['baz']}"] 
end 

Это не работает для script ресурсов стиля, хотя, которые принимают строку для фрагмента сценария для запуска, в том числе powershell_script. Там вам нужно что-то более приспособленное к PowerShell, и я не знаю его правил достаточно хорошо, чтобы сказать, будут ли Shellwords соответствовать.

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