Я могу выразить свою потребность в следующем сценарии: Напишите функцию, которая принимает строку для запуска как собственную команду.
Идея не слишком далека: если вы взаимодействуете с другими утилитами командной строки из другой части компании, которые предоставляют вам команду для дословного запуска. Поскольку вы не управляете командой, вам необходимо принять любую допустимую команду в качестве ввода . Вот основные икоты, которые я не смог легко преодолеть:
Команда может выполнить программу, находящуюся в пути с пробелом в ней:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Команда может иметь параметры с пробелами в них:
$command = 'echo "hello world!"';
Команда может иметь одинарные и двойные галочки:
$command = "echo `"it`'s`"";
Есть ли какой-нибудь чистый способ сделать это? Я только смог придумать обильные и безобразные обходные пути, но для языка сценариев я чувствую, что это должно быть очень просто.
источник
eval
наполовину шутит, потому что так его называют во многих других языках сценариев, и это не первый вопрос, о котором я не зналinvoke-expression
. И случай ОП звучит как внутренний сценарий.Invoke-Expression "& $command"
Пожалуйста, ознакомьтесь также с отчетом Microsoft Connect о том, насколько сложно использовать PowerShell для запуска команд оболочки (о, ирония судьбы).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Они предлагают использовать
--%
как способ заставить PowerShell прекратить попытки интерпретировать текст вправо.Например:
источник
Принятый ответ не работал для меня при попытке проанализировать реестр на наличие строк удаления и выполнить их. Оказывается, мне не нужно было звонить в
Invoke-Expression
конце концов.Я наконец-то наткнулся на этот красивый шаблон, чтобы увидеть, как выполнять строки удаления:
Это работает для меня, а именно потому,
$app
что я знаю, что внутреннее приложение будет иметь только два аргумента. Для более сложных строк деинсталляции вы можете использовать оператор соединения . Кроме того, я просто использовал хеш-карту, но на самом деле вы, вероятно, захотите использовать массив.Кроме того, если у вас установлено несколько версий одного и того же приложения, этот деинсталлятор будет циклически повторять их все одновременно, что сбивает с толку
MsiExec.exe
, так что есть и это.источник
Если вы хотите использовать оператор вызова, аргументы могут быть массивом, хранящимся в переменной:
Оператор вызова также работает с объектами ApplicationInfo.
источник