无论如何,PowerShell脚本都不会收到参数

时间:2016-06-20 20:20:08

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

尝试将单个命令行参数传递给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

2 个答案:

答案 0 :(得分: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'"

希望对您有所帮助。我知道,已经从死里复活了,但是我认为其他正在搜寻的人可以看到他们快要死了。

// ark

答案 1 :(得分:0)

我也有这个问题。我花了一些时间来恢复我以前做过的事情。

第一种方法:确保为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
祝你好运!