Как параметризовать вызов команды внутри блока сценария? [Дубликат]

Хотя это несколько старый, я хотел бы добавить немного улучшенную версию, которая действительно изменяет порядок столбцов. Вот шаги (если у нас есть таблица TAB1 со столбцами COL1, COL2, COL3):

  1. Добавить новый столбец в таблицу TAB1:
  alter table TAB1 add (NEW_COL number);  
  1. «Скопировать» таблицу в имя temp при изменении порядка столбца И переименовать новый столбец:
  создать таблицу tempTAB1 как select NEW_COL как COL0, COL1, COL2, COL3 из TAB1;  
  1. отменить существующую таблицу:
  drop table TAB1;  
  1. переименовать temp tablename, чтобы просто удалить tablename:
  переименовать tempTAB1 в TAB1;   
113
задан Travis 29 August 2010 в 00:05
поделиться

2 ответа

Вот еще один способ без Invoke-Expression, но с двумя переменными (команда: string & nbsp; and & nbsp; parameters: array). Он отлично работает для меня. Предположим, что 7z.exe находится в системном пути.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Если команда известна (7z.exe), и только параметры являются переменными, тогда это будет делать

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

BTW , Invoke-Expression с одним параметром тоже работает для меня, например это работает

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

P.S. Я обычно предпочитаю путь с помощью массива параметров, потому что его легче программировать, чем строить выражение для Invoke-Expression.

152
ответ дан Steven Penny 17 August 2018 в 10:32
поделиться
  • 1
    Отлично. Теперь он начинает объединяться. Вместо 'c: \ temp \ with space \ test1.zip' я могу просто использовать переменную $? Мне нужно поместить его в & quot; & quot; или '' ? – Travis 30 August 2010 в 14:50
  • 2
    +1 для метода массива, это мой предпочтительный способ сделать это. – Sayed Ibrahim Hashimi 21 August 2014 в 05:15
  • 3
    Кажется, что Splatting работает одинаково: & amp; $ cmd @prm Но мне интересно, почему – C2H5OH 9 March 2017 в 01:23

Попробуйте вызвать вашу команду с помощью invoke-expression.

invoke-expression $cmd1

Вот рабочий пример моей машины:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
invoke-expression $cmd
24
ответ дан kbrimington 17 August 2018 в 10:32
поделиться
  • 1
    Сообщает мне Термин «7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log 'не распознается как имя командлет, функция, файл сценария или исполняемая программа. Проверьте правильность написания имени или, если включен путь, проверьте правильность пути и повторите попытку. В строке: 14 символов: 1 + & amp; & Л; & л; & л; & л; $ cmd1 – Travis 29 August 2010 в 00:29
  • 2
    @Travis: Ой. амперсанд работает, если нет аргументов. Я обновил сообщение с помощью решения для вашей команды. – kbrimington 29 August 2010 в 00:32
  • 3
    Раньше я пытался вызывать выражение, и он не работал. Он выплевывает ошибку: Плохая числовая константа: 7. At: line: 1 char: 2 + 7z & lt; & lt; .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Похоже, что он пытается оценить его, а не выполнять его. – Travis 29 August 2010 в 00:47
  • 4
    @Travis: Возможно, 7z.exe не на вашем пути. Убедитесь, что он находится на пути и / или попробуйте указать полное имя пути для исполняемого файла в вашем выражении. – kbrimington 29 August 2010 в 00:59
  • 5
    @Travis: я только что подтвердил в своей собственной системе, что 7z.exe дал описанную вами ошибку, просто набрав из командной строки, но с полным путем до 7z.exe (для меня это было 'C:\Program Files\7-zip\7z.exe', я мог бы выполнить 7z .Exe. – kbrimington 29 August 2010 в 01:04
Другие вопросы по тегам:

Похожие вопросы: