【问题标题】:PowerShell script does not receive arguments no matter whatPowerShell 脚本无论如何都不会接收参数
【发布时间】:2016-10-22 05:15:19
【问题描述】:

尝试将单个命令行参数传递给 Windows 7 上的 powershell 脚本,但该脚本似乎无法识别任何参数。它穿过下面的第一行

foreach($arg in $args)
{
    Write-Host "Arg: $arg";
}

没有输出我在命令行上使用的任何内容,并且由于$args[0] 为空而失败。但是,如果我改为硬编码我试图从命令行分配的变量的值(它只是打开该文件并执行某些操作),我的脚本的其余部分就可以工作。

我受到这个答案Passing a variable to a powershell script via command line 的启发,特别是接受答案中的链接,并尝试使用param 块,但也没有打印出任何内容

param(
    [string]$fileName
)
Write-Host "Filename: [ $fileName ]";

当像script.ps1 -filename SampleFile.txt这样调用时

当我简单地将链接中的第一个脚本复制/粘贴到新脚本中时:

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args)
{
  Write-Host "Arg: $arg";
}

并将其称为1.ps1 1 2 3,其输出仅为Num Args: 0

我做错了什么?

PS:如果重要的话,这里是版本信息

PS Z:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

【问题讨论】:

  • 你能提供minimal reproducible example吗?我无法用您的代码重现所描述的行为。
  • 我提供了最小的、完整的示例,我完全理解这应该可以工作。但是它对我不起作用,这个问题的目的是找出原因。不幸的是,这对我不起作用,我无法满足您对示例可验证的要求。

标签: powershell windows-7 command-line-arguments


【解决方案1】:

我也有这个问题。我花了一段时间才恢复我之前所做的事情。

第一种方法:确保为 powershell 设置了 assoc、ftype%PATHEXT%

C:\>assoc .ps1
.ps1=Microsoft.PowerShellScript.1

C:\>ftype Microsoft.PowerShellScript.1
Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit -file %1 %~2

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.py;.pyw;.ps1

但这可能不适用于 Windows 7 或更高版本。

然后编辑注册表(此处适用所有注意事项)

编辑注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\0\Command

设置自

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1" 

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1" %~2

祝你好运!

【讨论】:

  • 当 PS1 脚本在 PS 命令提示符下执行时,所有这些都应该重要吗?我希望从常规命令提示符(不是我尝试过)执行时这很重要......
【解决方案2】:

我认为这与文件链接或注册表黑客无关! :) 运行示例代码时,使用您的代码时我也没有得到任何回报。但是,当您将参数设置为 MANDATORY 时,它会开始显示参数。只需正确格式化 PARAM,如:

  Param( [Parameter(Mandatory=$True)]
            [string]$argument_one
        ) 
  Write-Host "Hello World $argument_one"

你有它。现在您可以从 CMD 调用它,如下所示:

   powershell.exe -command "& 'thePSFile.ps1' -$argument_one 'it works now'"

我希望这会有所帮助。我知道,从死里复活,但我想其他一些搜索的人可以看到他们几乎在那里。

//方舟

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2018-11-29
    • 2012-02-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多