Param(
[Parameter(Mandatory=$true,Position=1)]
[string]$computerName
)
echo "arg0: " $computerName
C:\> myscript.ps1 -computerName hey
输出:
cmdlet myscript.ps1 at command pipeline position 1 Supply values for the following parameters: computerName: ddd arg0: ddd
我只是想在CMD中使用Powershell参数,我似乎无法获得一个脚本来获取一个。我看到网站说脚本前面有.\
,但这没有帮助。我添加了强制性行,以查看Powershell是否正在读取参数,而且显然不是。参数computerName
显然是“嘿”这个词。 Param
块是脚本中的第一件事。 Powershell似乎识别出参数computerName
,但无论我如何输入命令,它都不会认为我实际上正在输入参数。
我的语法出了什么问题?
答案 0 :(得分:2)
默认情况下,Powershell不会运行恰好在当前目录中找到的脚本。这是Microsoft打算作为安全功能,我相信它模仿unix shell中的行为。
Powershell将运行它在搜索路径中找到的脚本。您的搜索路径存储在$env:path
。
我怀疑在搜索路径上的某个其他目录中有一个名为“myscript.ps1”的脚本。
我之前遇到过这种情况。我看到的症状是参数列表看起来与我定义的不同。每个脚本都有一个不同的参数列表,因此当我向其提供一个用于其他脚本的参数列表时,脚本就会被轰炸。我的习惯是不依赖参数位置,所以这个问题很容易找到。
在脚本“。\ myscript.ps1”中添加“。\”应该强制shell使用当前目录中的.ps1文件。作为测试,我将指定您尝试执行的文件的完整路径(如果路径中有空格,请确保将路径包装在“引号”中)或将其更改为一些完全不会疯狂的名称被其他文件复制(如“crazyfishpants.ps1”)并查看shell是否仍然找到该文件。
如果你有一个从与脚本文件同名的模块或配置文件中加载的函数(“Get-Foo”)(“Get-Foo.ps1”),你可能会遇到类似的问题。你可能最终会运行你想要的东西。
答案 1 :(得分:1)
位置值应该从0开始(第一个参数为0)。也就是说,我无法复制您在PowerShell 2.0或3.0上看到的内容。
答案 2 :(得分:0)
感谢大家提供的非常丰富的回复。在我提交之前看起来我的问题被略微编辑了,因为文本让你相信我直接在Powershell中输入了这个命令。
我实际上是在CMD中运行脚本命令,这完全解释了为什么它没有将参数传递给Powershell脚本。绿灯点亮我的问题的人可能改变了C:\>到PS>以为我写了一个错字。
我认为如果我可以直接从CMD运行脚本,我可以在CMD的命令行上向它发送参数,但显然情况并非如此。如果我在Powershell中运行脚本,它确实可以正常工作,我现在正在看。
我的最终目标是允许用户从CMD运行Powershell脚本。看起来我可以创建一个接受参数的批处理文件,然后启动powershell并将这些参数发送到PS脚本。因此,在批处理文件中,我应该执行以下操作:
powershell -File C:\myscript.ps -computerName %1
这个谜团可能在这个网站上解决了100次,我为这个混乱道歉。再次感谢您的回复。