将参数传递给PowerShell

4

我有一个用PowerShell编写的脚本,可以在Active Directory和MS Exchange中完成一些任务。 我需要从我们的呼叫记录系统中传递Active Directory用户名。 让呼叫记录系统传递参数很简单。

我面临的问题是让PowerShell将该参数读入变量中。

我将提供一个概念证明示例。

这是一个将参数传递给PowerShell的示例命令。

C:\Users\UserName\Desktop\Test.ps1 -ADusername "Hello World"

以下是示例脚本:

Param([string]$adusername)
$adusername
pause

我希望能得到以下输出结果:
Hello World
Press Enter to continue...:

这是实际输出:
Press Enter to continue...:

仅仅理解这个核心概念就能对我有很大帮助。当我将其应用到我的场景中时,我无法找到任何可行的示例或教程。如果这是一个重复的帖子,我很抱歉,因为我在这个网站上也没有找到任何相关内容。

编辑:按要求,这是我的完整脚本:http://pastebin.com/ktjpLQek


1
你从哪里运行这个脚本?我在PowerShell中可以运行它。(虽然我还没有使用PowerShell 5.0。) - Etan Reisner
@EtanReisner,对我来说,在2上也很好用。在没有先调用PowerShell的情况下调用params看起来很奇怪,而且大多数时候按顺序调用$args[x]似乎是最简单的路线(特别是对于一个参数)。 - Austin T French
@AustinFrench 你的意思是“不先调用PowerShell”吗?你是指尝试直接从cmd.exe运行PowerShell脚本吗? - Etan Reisner
脚本目前在我的桌面上,但我正在从运行对话框中运行,以模拟我将要使用的应用程序的命令。正在运行 PS5。 - mttp1990
@EtanReisner 正确,例如从运行命令行、快捷方式、计划任务等。 - Austin T French
3个回答

8
我认为,如果您避免尝试使用参数并按照这种方式直接调用脚本,那么您的运气会更好。
虽然有可能实现,但如果您将脚本文件内嵌,参数会更加有效。
. .\scriptFile.ps1
function "Hello World"

然而,若要更接近你所做的事情,你应该使用 $args 并且 直接调用 PowerShell(exe文件)。

如果你像这样调用脚本文件:(我使用了运行框)

powershell c:\Path\Folder\Script.ps1 "Hello World!"

然后将Param([string]$adusername)替换为:

$adUserName = $args[0]
write-host $adUserName

此外,这对您应该有帮助(进行解析):
Param([string]$ad)

Write-Host $args[0]
Write-Host $ad

Read-Host
pause

使用路径调用脚本,命令为powershell c:\Path\Folder\Script.ps1 "Hello World!" $ad = "JSmith"

如果无法运行,请确保执行策略设置正确。可以使用Get-ExecutionPolicy查看当前级别。测试时,您可以使用Set-ExecutionPolicy unrestricted将其设置得非常低。


这似乎只有间歇性地工作。由于我要准备搬家,所以我将在周一重新审视它。这是我的完整脚本:http://pastebin.com/ktjpLQek - mttp1990
这个只运行了一次,所以概念验证是成功的,我会将其标记为已回答。但我仍然不知道为什么它对我不起作用。 - mttp1990
1
@mttp1990 我对于“它曾经工作过”的情况也感到很困惑... 你有没有移动脚本文件或者做了其他什么改动? 你的执行策略是什么? - Austin T French
执行策略是不受限制的。我有一堆其他脚本,用来加快我的日常任务。脚本没有移动位置。明天我会在一个隔离的环境中尝试一下,看看是否只是我的电脑出了问题。 - mttp1990

3
将以下内容添加到脚本顶部。
Param(
  [Parameter(Mandatory=$true)]
  [string]$Euser
)

Write-Host "Deactivating $EUser"

在切换到脚本目录后调用示例

.\ScriptName.ps1 -Euser "FOO" # Tab auto completion works

如果我这样做,它会提示我在运行脚本窗口中输入预期的参数,这告诉我没有传递参数给脚本,并且因为我们将参数列为必需,所以似乎期望有些东西。 - mttp1990

0

以下新脚本对我有效。

Param([string]$servers)
"You chose $servers"

PS C:\scripts> .\Untitled1.ps1 "this test"

你选择了这个测试

PS C:\scripts>


1
我在我的端上复制了你的脚本,但是我的输出中没有显示字符串变量。我只得到了“你选择了”。 - mttp1990
你能在pastebin.com上粘贴并分享你的脚本吗?那个"param"标记很有效,并且我已经安装了PowerShell v5。$PSVersionTable.PSVersion - user4317867
你能否尝试一下这篇 Hey Scripting Guy 的文章,了解有关参数集的最佳实践(https://blogs.technet.microsoft.com/heyscriptingguy/2013/04/11/named-arguments-for-powershell-functions-best-practices/)?虽然这是针对函数的,但在 PowerShell ISE 中应该可以按照所描述的方式工作。 - user4317867
这个似乎也不起作用。我能够使用这种方法从脚本内部传递一个参数,并且我过去已经能够做到这一点了,但某些事情阻止了来自 PowerShell 环境外部的参数传递。 - mttp1990
你打算传递什么类型的对象到PowerShell脚本中?我非常有兴趣弄清楚为什么一个简单的接受参数的脚本在你的环境中无法工作。在我看来,能够使用参数创建和测试脚本是至关重要的。 - user4317867
我们正在使用非常老的Front-range HEAT版本作为我的呼叫记录系统。(即将升级)。参数以应用程序指定的格式作为纯文本传递。在这种情况下,它被传递为sscript.ps1 "Hello, World!"。我已经创建了一个自动任务,将我的参数写入文本文件(如果存在则覆盖),然后调用我的脚本,该脚本读取仅包含我的参数的文本文件。这是一个愚蠢的解决方法,但是它正在工作。 - mttp1990

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接