2015-02-11 2 views
0

Мне нужно создать строку, которая на самом деле является командной строкой, а затем выполнить содержимое этой командной строки. Я надеялся, что оператор вызова (&) поможет, но похоже, что нет. Вот простой надуманный пример. Следующие работы, как и ожидалось, он пингует сайт:Создайте строку, которая будет передана оператору вызова

$command = "ping" 
$website = "www.bbc.co.uk" 
& $command $website 

однако, если я могу изменить его к этому:

$command = "ping" 
$website = "www.bbc.co.uk" 
$cmd = "$command $website" 
& $cmd 

Я получаю сообщение об ошибке:

The term 'ping www.bbc.co.uk' is not recognized as the name of a cmdlet, function, script file, or operable program.

Есть ли способ динамически создавать командную строку в виде строки, а затем выполнять ее?

+1

использовать 'iex $ cmd' вместо –

+0

Спасибо @CB., Что действительно работает для моего надуманного примера. Однако, похоже, мой надуманный пример недостаточно репрезентативен. То, что я действительно хочу сделать, это вызвать .exe, поэтому на самом деле я делаю что-то более похожее на это: $ cmd = "C: \ somepath \ someprogram.exe" iex $ cmd Результат от этого просто: C: \ somepath \ someprogram.exe , т. Е. Не выполняет someprogram.exe. Любая идея почему? – jamiet

+0

@CB. Поскольку мой тривиальный пример выше не был достаточно репрезентативным, я снова разместил его здесь: http://stackoverflow.com/questions/28453865/execute-an-exe-using-the-call-operator – jamiet

ответ

4

Да, но вам нужно использовать Invoke-Expression (что точно так же, как eval), вместо оператора вызова. Обратите внимание, что вам также необходимо убедиться, что все ваши цитаты верны в этом случае. Например.

$cmd = "'$command' '$website'" 

будет работать в вашем тривиальный пример, если $command или $website не содержали одиночные кавычки. Проблема здесь в том, что все, что вы помещаете в строку, зависит от обычных правил синтаксического анализа PowerShell.

Как правило, вы можете находиться как можно дальше от Invoke-Expression. Есть несколько проблем, которые ему нужны, но вызывают внешние программы ... не так много.

Гораздо лучшей альтернативой, особенно если у вас есть произвольное количество аргументов, чтобы просто собрать аргументы в массив и использовать оператор пейнтбольный (обратите внимание на @ в примере кода ниже):

$command = 'ping' 
$arguments = '-t','www.bbc.co.uk' 
&$command @arguments 

Это гарантирует, что аргументы правильно цитируются, когда это необходимо, и обычно избегает много головных болей, которые вы получите с Invoke-Expression.

(Side Примечание: Если у вас есть проблема в PowerShell и думают »О, я просто хочу, чтобы использовать строку«, часто время, чтобы переосмыслить, что Это включает в себя обработку имен файлов или командную строку.. PowerShell имеет объекты, сводя их к возможностям ранних оболочек, просто дает ту же боль, что и в других местах, например, несколько уровней экранирования, иногда с разными синтаксисами и т. Д. И чаще всего есть лучшие способы решения проблемы.)

+0

Спасибо @Joey, очень полезно , Оказывается, мой тривиальный пример выше не был достаточно репрезентативным из реальной проблемы, с которой я столкнулся, поэтому я переписал и разместил здесь: http://stackoverflow.com/questions/28453865/execute-an-exe-using-the-call -оператор – jamiet

+1

Я бы сказал, что ваш новый вопрос по-прежнему точно соответствует ответу.Взгляните на вторую половину ответа. – Joey

+0

Привет, Джо, боюсь, что у меня что-то не хватает, потому что первая часть моего второго потока пытается сделать то, что вы описали здесь (т. Е. Передаете аргументы в виде массива) и не работает. Как я уже сказал, я что-то упускаю, но, боюсь, я не знаю, что? – jamiet

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