我正在尝试从运行对话框运行一个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'
可以正常工作。
答案 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并传递其余部分的第一行的常量代码
它的文件。
传递参数很棘手。我有常量代码的多种变体
因为一般情况很痛苦。
不传递参数时,.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等。)
传递不包含空格或“单引号”的参数时 (这在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]
传递“双引号”但不包含的参数时 和&和'字符,我使用双线代替所有“与'
@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]
最常见的情况是通过环境变量传递参数
因此,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