您可以通过两种不同的方式将参数传递给PowerShell脚本。 (如果您不了解PowerShell,请参阅技巧“`link:/ windows-Introduction_to_PowerShell [PowerShell简介]”。)可以按位置或按名称传递参数。两者都是同等有效的,因此让我们看一下它们是如何完成的。

我有一个名为LookForFiles.ps1的PowerShell脚本。它在给定目录中查找文件,并显示大小超过20K的文件。现在,我的脚本如下所示:

$files = Get-ChildItem C:\Temp foreach ($file in $files)

{     if ($file.length -gt 20000)

{         Write-Output $file     } }

如您所见,我的目录名称(C:\ Temp)和要检查的大小(20000)都是硬编码的。相反,我希望传递目录名称和大小,以便我的脚本更加灵活。

首先,我将进行更改,以便按位置传递这些参数,即,第一个参数将是目录,第二个参数将是大小。我的新脚本如下所示:

$files = Get-ChildItem args[0]

foreach ($file in $files)

{     if ($file.length -gt args[1])

{         Write-Output $file     } }

现在,我调用脚本并观察输出:(参见图1。)

image

图1.传递位置参数。

请注意,当我调用脚本时,我传递了两个参数,即“ C:\ Temp”和“ 20000”。这些填充为“ $ args [0]”和“ $ args [1]”

分别使脚本执行与以前完全相同。现在,让我们修改脚本,以便它需要命名参数:

param([string] $dir = "C:\Temp",        [int32] $size = 20000)

$files = Get-ChildItem $dir foreach ($file in $files)

{     if ($file.length -gt $size)

{         Write-Output $file     } }

注意,我删除了对“ $ args”变量的引用。还要注意,第一行(扩展到第二行)是“参数”

声明。这告诉PowerShell期望命名参数。此“ param”语句必须是脚本的第一行。它定义了两个变量并将它们初始化为默认值。它定义字符串变量$ dir并将其默认设置为“ C:\ Temp”,并定义int32(数字)变量$ size并将其默认设置为20000。这些值将使用默认值进行初始化,以便当脚本被调用后,它将仍然运行并使用这些值。

现在,我以前拥有$ args [0]的位置现在有了$ dir变量,而我曾经拥有$ args [1]的位置现在有了$ size变量。让我们调用脚本,指定以下命名参数:

(请参见图2。)

image

图2.传递命名参数。

现在,在调用脚本时,我指定“ -dir”,后跟我感兴趣的目录,并指定“ -size”以表示我感兴趣的大小。由于这些都是命名参数,因此我可以颠倒它们的顺序,首先指定“ -size”,然后指定“ -dir”。

或者,我可以完全省略它们,并将使用脚本中的值。

本技巧(2902)适用于Windows 7、8和10。