尝试将单个命令行参数传递给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
答案 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
祝你好运!