0

我的脚本.ps1

Param(
    [Parameter(Mandatory=$true,Position=1)]
    [string]$computerName
)

echo "arg0: " $computerName

命令文件

C:\> myscript.ps1 -computerName hey

输出:

    命令管道位置 1 处的 cmdlet myscript.ps1
    为以下参数提供值:
    计算机名称:ddd
    参数0:
    ddd

我只是想在 CMD 中使用 Powershell 参数,但我似乎无法获得一个脚本来获取一个。我看到网站说要在脚本之前使用,.\但这无济于事。我添加了强制行以查看 Powershell 是否正在读取参数,显然不是。参数computerName显然是“嘿”这个词。Param块是脚本中的第一件事。Powershell 似乎可以识别参数computerName,但无论我如何输入命令,它都不会认为我实际上是在输入参数。

我的语法到底有什么问题?

4

3 回答 3

2

默认情况下,Powershell 不会运行它恰好在您当前目录中找到的脚本。这是微软打算作为一项安全功能的,我相信它模仿了 unix shell 中的行为。

Powershell 将运行在您的搜索路径中找到的脚本。您的搜索路径存储在$env:path.

我怀疑您在搜索路径上的某个其他目录中有一个名为“myscript.ps1”的脚本。

我以前也遇到过这种情况。我看到的症状是参数列表似乎与我定义的不同。每个脚本都有一个不同的参数列表,所以当我给它提供一个用于其他脚本的参数列表时,脚本被炸毁了。我的习惯是不依赖参数位置,所以这个问题很容易找到。

在脚本“.\myscript.ps1”中添加“.\”应该会强制 shell 使用当前目录中的 .ps1 文件。作为测试,我会指定您尝试执行的文件的完整路径(如果路径中有空格,请确保将路径包含在“引号”中)或将其更改为一些完全疯狂的名称,不会被其他文件(如“crazyfishpants.ps1”)复制并查看shell是否仍然找到该文件。

如果您有一个从与脚本文件(“Get-Foo.ps1”)同名的模块或配置文件中加载的函数(“Get-Foo”),您可能会遇到类似的问题。你可能会跑出你想要的东西之外的东西。

于 2012-09-26T13:48:01.063 回答
1

位置值应从 0 开始(第一个参数为 0)。也就是说,我无法复制您在 PowerShell 2.0 或 3.0 上看到的内容。

于 2012-09-26T05:28:29.463 回答
0

感谢大家提供的非常翔实的答复。看起来我的问题在我提交之前经过了轻微的编辑,因为文本让你相信我是直接在 Powershell 中输入这个命令的。

我实际上是在 CMD 中运行脚本的命令,这完全解释了为什么它没有将参数传递给 Powershell 脚本。谁为我的问题开了绿灯,可能认为我打错了,将 C:\> 更改为 PS>。

我假设如果我可以直接从 CMD 运行脚本,我可以在 CMD 的命令行上向它发送参数,但显然情况并非如此。如果我在 Powershell 中运行脚本,它确实工作得很好,我现在看到了。

我的最终目标是允许用户从 CMD 运行 Powershell 脚本。看起来我可以制作一个接受参数的批处理文件,然后启动 powershell 并将这些参数发送到 PS 脚本。因此,在批处理文件中,我应该执行以下操作:

powershell -File C:\myscript.ps -computerName %1

这个谜可能在这个网站上被解决了 100 次,我为造成的混乱道歉。再次感谢您的回复。

于 2012-09-26T22:26:38.223 回答