将参数传递给powershell脚本

时间:2013-09-27 16:30:02

标签: windows powershell parameters cmd

我正在尝试从运行对话框运行一个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'可以正常工作。

2 个答案:

答案 0 :(得分:4)

在脚本路径前使用-file

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

答案 1 :(得分:4)

我通常从cmd.exe运行powershell脚本,因为这是可移植的 (在开发人员或客户端的其他计算机上开箱即用): 无需担心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!
    

    这使用powershell.exe的-Command参数。 Powershell读取.cmd 文件作为文本,将其放在ScriptBlock中,第一行注释掉, 并使用'。'对其进行评估。命令。 进一步command line arguments 可以根据需要添加到Powershell调用中(例如-ExecutionPolicy Unrestricted, -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 B=@powershell -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