如何将命令行参数传递给PowerShell ps1文件

时间:2009-08-18 13:37:11

标签: command-line powershell arguments

多年来,我使用了cmd/DOS/Windows shell并将命令行参数传递给批处理文件。例如,我有一个文件zuzu.bat,其中,我访问%1%2等。现在,我想在调用PowerShell时也这样做脚本when I am in a Cmd.exe shell。我有一个脚本,xuxu.ps1(我已经将PS1添加到我的PATHEXT变量和与PowerShell关联的PS1文件中)。但无论我做什么,我似乎都无法从$args变量获得任何东西。它的长度始终为0。

如果我在PowerShell shell中,而不是cmd.exe,那么它(当然)就可以了。但我还不够舒服,无法全时在PowerShell环境中生活。我不想输入powershell.exe -command xuxu.ps1 p1 p2 p3 p4。我想输入xuxu 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 a b c d
Num Args: 0
c:\temp>

7 个答案:

答案 0 :(得分:29)

This article有帮助。特别是,本节:

  

-File

     

在本地范围(“dot-sourced”)中运行指定的脚本,以便脚本创建的函数和变量在当前会话中可用。输入脚本文件路径和任何参数。文件必须是命令中的最后一个参数,因为在File参数名称后键入的所有字符都被解释为脚本文件路径,后跟脚本参数。

即。

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

表示运行文件myfile.ps1和arg1 arg2& arg3是PowerShell脚本的参数。

答案 1 :(得分:17)

好的,首先这是打破PowerShell中的基本安全功能。根据这种理解,您可以采用以下方式:

  1. 打开Windows Explorer窗口
  2. 菜单工具 - > 文件夹选项 - >选项卡文件类型
  3. 找到PS1文件类型,然后单击高级按钮
  4. 点击“新建”按钮
  5. For Action put:打开
  6. 对于应用程序放置:“C:\ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe”“ - file”“%1”%*
  7. 您可能还想在其中添加-NoProfile参数,具体取决于您的个人资料的作用。

答案 2 :(得分:15)

在深入了解PowerShell文档后,我发现了一些有关此问题的有用信息。如果您在文件开头使用$args,则无法使用param(...);相反,您需要使用$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 a b c d

结果是......

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d

答案 3 :(得分:9)

在文件中声明你的参数,比如param([string] $ para1 ....... [string] $ param2)。

现在调用PowerShell文件,如temp.ps1 para1 para2....para10等。

答案 4 :(得分:6)

也许您可以将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

答案 5 :(得分:1)

你可能看不到“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更加舒服。

答案 6 :(得分:0)

如果要从cmd调用ps1脚本并传递参数而不调用脚本,例如

powershell.exe script.ps1 -c test
script -c test ( wont work )

您可以执行以下操作

setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*

这假设powershell.exe在您的路径中

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype