2013-09-27 256 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' 

但它無法在閱讀的參數。

在powershell上運行.\script.ps1 -title 'Hello world' -msg 'This is a test message'工作正常。

+1

使用-command選中此SO回答-http://stackoverflow.com/questions/12691781/scheduled-task-for-powershell-script-with -string陣列面值ameter – Mitul

+0

如果您能告訴我們「它失敗」的含義,這將有所幫助。如果有錯誤消息,請引用錯誤消息,或者告訴我們發生了什麼以及您期望發生什麼。 –

回答

3

使用-file的路徑,你的腳本之前:

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

這工作,謝謝! – desto

2

我通常運行cmd.exe的從PowerShell腳本,因爲這是便攜式 (作品外的即裝即用別人的電腦,就像開發商人或客戶): 無需擔心Set-ExecutionPolicy或關聯.ps1擴展名。

我創建.cmd擴展名(代替的.ps1)的文件,複製粘貼&短, 恆定代碼來調用powershell.exe並傳遞文件的其餘部分 到第一線(S)它。
傳遞參數非常棘手。我有常數代碼 的多種變體,因爲一般情況是痛苦的。

  1. 時不傳遞參數,.cmd文件看起來是這樣的:

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

    它使用powershell.exe的-Command說法。 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. 最常見的情況是通過環境變量傳遞參數 因此Powershell的param()聲明不起作用。在這種情況下, 論據預計是「雙引號」,可能含有「或& (除.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