2013-09-27 6 views
4

Я пытаюсь запустить скрипт powershell из диалогового окна запуска (будет использоваться в качестве запланированной задачи), и у меня возникают проблемы с передачей параметров.Передача параметров сценарию powershell

Сценарий будет принимать два параметра с названием title и msg. Сценарий находится в: D:\Tasks Scripts\Powershell\script.ps1

Это то, что я пытаюсь сделать:

powershell.exe -noexit 'D:\Tasks Scripts\Powershell\script.ps1' -title 'Hello world' -msg 'This is a test message' 

Но он не при чтении параметров.

Бег .\script.ps1 -title 'Hello world' -msg 'This is a test message' на powershell работает отлично.

+1

Использование -command Проверить этот SO ответ -http: //stackoverflow.com/questions/12691781/scheduled-task-for-powershell-script-with -string-обр ay-parameter – Mitul

+0

Это поможет, если вы скажете нам, что означает «это не удается». Отправьте сообщение об ошибке, если оно есть, или сообщите нам, что произойдет, и что вы ожидали вместо этого. –

ответ

3

Использование -file перед путь к вашему сценарию:

powershell.exe -noexit -file 'D:\Tasks Scripts\Powershell\script.ps1' etc... 
+0

Это сработало, спасибо! – desto

2

Я обычно запустить Powershell сценарии из cmd.exe, потому что это портативный (работает вне коробки на других компьютерах, как разработчик люди или клиенты): не нужно беспокоиться о Set-ExecutionPolicy или связывать расширение .ps1.

Я создаю файл с расширением CMD-(вместо .PS1), а затем скопировать & вставить короткий, постоянного код на первую линию (ы), который вызывает powershell.exe и передает остальное файла, Это.
Передача аргументов сложна. У меня есть несколько вариантов постоянного кода , потому что общий случай болезнен.

  1. когда не передавая аргументы, то CMD-файл выглядит следующим образом:

    @powershell -c ".(iex('{#'+(gc '%~f0' -raw)+'}'))" & goto :eof 
    # ...arbitrary PS code here... 
    write-host hello, world! 
    

    Это использует -command аргумент powershell.exe. Powershell читает файл .cmd как текст, помещает его в ScriptBlock с первой прокомментированной строкой, и оценивает его с помощью. команда. Далее command line arguments может быть добавлен к вызову Powershell по мере необходимости (например, -ExecutionPolicy Неограниченного, -sta и т.д.)

  2. при передаче аргументов, которые не содержат пробела или являются «одиночными кавычками» (который не является Нестандартный в cmd.exe), то один вкладыш заключается в следующем: может быть использован

    @powershell -c ".(iex('{#'+(gc($argv0='%~f0') -raw)+'}'))" %* & goto :eof 
    
    write-host this is $argv0 arguments: "[$($args -join '] [')]" 
    

    param() декларации, а также, $args не является обязательным.
    $argv0 Используется для компенсации недостающих данных $MyInvocation.PS*.
    Примеры:

    G:\>lala.cmd 
    this is G:\lala.cmd arguments: [] 
    
    G:\>lala.cmd "1 2" "3 4" 
    this is G:\lala.cmd arguments: [1] [2] [3] [4] 
    
    G:\>lala.cmd '1 2' '3 4' 
    this is G:\lala.cmd arguments: [1 2] [3 4] 
    
  3. при передаче аргументов, которые «двойные кавычки», но не содержат в & и «символов, я использую два лайнера, чтобы заменить все" с»

    @echo off& set A= %*& set [email protected] -c "$argv0='%~f0';.(iex('{' 
    %B%+(gc $argv0|select -skip 2|out-string)+'}'))" %A:"='%&goto :eof 
    
    write-host this is $argv0 arguments: "[$($args -join '] [')]" 
    

    (Обратите внимание, что пространство имеет важное значение в A= %* для присвоения аргументов меньше случае.)
    Результаты:

    G:\>lala.cmd 
    this is G:\lala.cmd arguments: [] 
    
    G:\>lala.cmd "1 2" "3 4" 
    this is G:\lala.cmd arguments: [1 2] [3 4] 
    
    G:\>lala.cmd '1 2' '3 4' 
    this is G:\lala.cmd arguments: [1 2] [3 4] 
    
  4. самый общий случай передает аргументы через переменные среды , поэтому заявка param() Powershell не работает. В этом случае аргументы, как ожидается, будут «двойные кавычки» и могут содержать "или & (для пути самого CMD-файла, за исключением):

    ;@echo off & setlocal & set A=1& set ARGV0=%~f0 
    ;:loop 
    ;set /A A+=1& set ARG%A%=%1& shift& if defined ARG%A% goto :loop 
    ;powershell -c ".(iex('{',(gc '%ARGV0%'|?{$_ -notlike ';*'}),'}'|out-string))" 
    ;endlocal & goto :eof 
    for ($i,$arg=1,@(); test-path -li "env:ARG$i"; $i+=1) { $arg += iex("(`${env:ARG$i}).Trim('`"')") } 
    write-host this is $env:argv0 arguments: "[$($arg -join '] [')]" 
    write-host arg[5] is ($arg[5]|%{if($_){$_}else{'$null'}}) 
    

    (Отметим, что в первой строке A=1& не должно содержать пробел)
    Результат:.

    G:\>lala.cmd "a b" "c d" "e&f" 'g' "h^j" 
    this is G:\lala.cmd arguments: [a b] [c d] [e&f] ['g'] [h^j] 
    arg[5] is $null 
    
Смежные вопросы