如何将命令行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文件)。 但是无论我做什么,我似乎都无法从$argsvariables中获取任何东西。 它总是长度为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。 有了这样的理解,这里是你如何做到这一点:

  1. 打开Windows资源pipe理器窗口
  2. 菜单工具 – > 文件夹选项 – >选项卡文件types
  3. findPS1文件types,然后单击高级button
  4. 点击新buildbutton
  5. 对于行动把: 打开
  6. 对于应用程序: “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