如何将命令行parameter passing给PowerShell ps1文件
多年来,我使用了cmd/DOS/Windows
shell,并将命令行parameter passing给batch file。 例如,我有一个文件zuzu.bat
并且在其中访问%1
, %2
等。现在,我想when I am in a Cmd.exe shell
调用PowerShell
脚本when I am in a Cmd.exe shell
执行相同的操作。 我有一个脚本, xuxu.ps1
(我已经将PS1添加到我的PATHEXTvariables以及与PowerShell关联的PS1文件)。 但是无论我做什么,我似乎都无法从$args
variables中获取任何东西。 它总是长度为0。
如果我在一个PowerShell
shell,而不是cmd.exe
,它的作品(当然)。 但是,我还不够舒适,无法全天在PowerShell环境中工作。 我不想inputpowershell.exe -command xuxu.ps1 p1 p2 p3 p4
。 我想inputxuxu p1 p2 p3 p4
。
这是可能的,如果是这样,怎么样?
我不能工作的样本是微不足道的,foo.ps1:
Write-Host "Num Args:" $args.Length; foreach ($arg in $args) { Write-Host "Arg: $arg"; }
结果总是如此:
C:\temp> foo Num Args: 0 C:\temp> foo abcd Num Args: 0 c:\temp>
这篇文章有帮助。 特别是这一节:
-文件
运行本地作用域中的指定脚本(“点源”),以便脚本创build的函数和variables在当前会话中可用。 input脚本文件path和任何参数。 文件必须是命令中的最后一个参数,因为在File参数名称后键入的所有字符都被解释为脚本文件path,后面跟着脚本参数。
即
powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3
意味着运行文件myfile.ps1和arg1 arg2&arg3是PowerShell脚本的参数。
好的,首先这是在PowerShell中打破基本的安全function。 有了这样的理解,这里是你如何做到这一点:
- 打开Windows资源pipe理器窗口
- 菜单工具 – > 文件夹选项 – >选项卡文件types
- findPS1文件types,然后单击高级button
- 点击新buildbutton
- 对于行动把: 打开
- 对于应用程序: “C:\ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe”“-file”“%1”%*
您可能还想在此处添加-NoProfile
参数,具体取决于您的configuration文件所做的事情。
在深入研究PowerShell文档之后,我发现了一些有关这个问题的有用信息。 如果您在文件开头使用了param(...)
,则不能使用$args
; 相反,您将需要使用$PSBoundParameters
。 我将你的代码复制/粘贴到一个PowerShell脚本中,并且在PowerShell版本2中按照你的预期工作(当你遇到这个问题时,我不确定你的版本是什么)。
如果你使用的是$PSBoundParameters
(而且这个只适用于你在脚本开头使用param(...)
),那么它不是一个数组,它是一个哈希表,所以你需要引用它键/值对。
param($p1, $p2, $p3, $p4) $Script:args="" write-host "Num Args: " $PSBoundParameters.Keys.Count foreach ($key in $PSBoundParameters.keys) { $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + " " } write-host $Script:args
而当被叫…
PS> ./foo.ps1 abcd
结果是…
Num Args: 4 $p1=a $p2=b $p3=c $p4=d
在文件中声明你的参数,比如param([string] $ para1 ……. [string] $ param2)。
现在调用PowerShell文件,如temp.ps1 para1 para2....para10
等
也许你可以把PowerShell的调用包装在一个.bat
文件中,如下所示:
rem ps.bat @echo off powershell.exe -command "%*"
如果你把这个文件放在你的PATH
文件夹下,你可以调用PowerShell脚本:
ps foo 1 2 3
引用可能会有点混乱,但:
ps write-host """hello from cmd!""" -foregroundcolor green
你可能看不到“xuxu p1 p2 p3 p4”。 但是,当你在PowerShell中,并设置
PS > set-executionpolicy Unrestricted -scope currentuser
你可以像这样运行这些脚本:
./xuxu p1 p2 p3 p4
要么
.\xuxu p1 p2 p3 p4
要么
./xuxu.ps1 p1 p2 p3 p4
我希望能让你更熟悉PowerShell。
不要在你的条件块中引用$ arg