如何将所需的参数传递给 Powershell ISE 中的脚本?

Posted

技术标签:

【中文标题】如何将所需的参数传递给 Powershell ISE 中的脚本?【英文标题】:How to pass needed parameters to script in Powershell ISE? 【发布时间】:2011-06-09 01:26:36 【问题描述】:

见标题。

我在脚本的头部指定了所需的参数:

param ($G_ARCHIVE = $(throw "Need file to upload!"),
       $G_LOGFILE = $(throw "Need logfile!"))

当我想用 Powershell ISE 调试脚本时:如何填写这些参数?

【问题讨论】:

【参考方案1】:

使用命令窗格。在 ISE 编辑器中打开脚本文件,设置断点 (F9)。然后在命令窗格中键入使用所需参数调用此脚本的命令。我认为在 ISE 中没有其他(内置)方法可以做到这一点。

【讨论】:

这种方法对我不起作用,因为我的文件路径中有空格,解决方案是按以下方式使用“与号函数”:PS C:\Windows> &("c: \我的文件夹\script.ps1") -myArg 123 -anotherArg abc 其实可以使用相对路径:.\script.ps1【参考方案2】:
    在 Windows Powershell ISE 中打开脚本 (myscript.ps1) 在要检查的变量处按 F9(调试)。例如下面示例中的第二行,其中 $outputText 变量被分配 在 shell 窗口中提供脚本的相对路径以及参数值。例如:.\myscript.ps1 "我的价值" 按回车键(你不需要按F5) 您将能够看到以黄色突出显示的调试断点。将光标放在所需的变量上以检查当前值。

【讨论】:

这个答案与接受的答案有何不同? 用插图解释更多细节的想法会对其他人有所帮助。例如,需要提供相对(或绝对)位置,而这并不是一开始就提供的。【参考方案3】:

还有另一种方法。您可以使用存在的$PSDefaultParameterValues 自动变量(自 v3 起)为 cmdlet 和 高级 函数(不适用于普通函数)提供新的默认参数。但是,它确实适用于脚本,即使在 ISE 中进行调试也是如此。你必须声明[CmdletBinding()][Parameter()],就像你声明一个高级函数一样。

所以对于你的例子,

[CmdletBinding()]
param ($G_ARCHIVE = $(throw "Need file to upload!"),
$G_LOGFILE = $(throw "Need logfile!"))

您将在 ISE 提示上执行类似的操作:

$PSDefaultParameterValues.add("ExampleScript.ps1:G_ARCHIVE","File-to-upload.txt")
$PSDefaultParameterValues.add("ExampleScript.ps1:G_LOGFILE","Example.log")

您还可以将参数值设置为将在运行时自动执行的脚本块:

$PSDefaultParameterValues["ExampleScript.ps1:G_LOGFILE"]=
  "Example-0:yyMMddHHmm.log" -f [datetime]::Now

变量是一个哈希表,所有标准语法都适用,除了 key 必须有脚本(或高级函数或 cmdlet)的名称,后跟一个冒号,然后是参数名称。您可以为多个脚本或命令设置默认值,并为每个设置多个参数(每个参数都是一个新的表条目)。

通过这种方式,您只需按 F5 即可正常运行脚本。参数将从变量中获取,因此您不必输入任何内容。

$PSDefaultParameterValues 的其他用例可能是自定义,例如让 Get-History 仅获取最后 10 个条目,除非您在命令中指定 -Count 参数。因为条目仅在当前会话中保留,您可能希望将自定义添加到您的profile。您可以通过在提示符处键入Get-Help about_Parameters_Default_Values 来阅读更多信息,或在TechNet 上查看相同的信息。

【讨论】:

另一个脚本块示例。您可以让您的脚本自动使用最新的 zip 文件。 $PsDefaultParameterValues=["ExampleScript.ps1:G_ARCHIVE"]=(ls *.zip | sort lastwritetime | select -last 1).fullname 当您不断创建一些外部数据集的新版本来测试和调试脚本时,这种东西非常有用。 $PSDefaultParameterValues.Item("KEY") = "VALUE" 是另一种选择 它仅在使用[Parameter()] 装饰器声明参数时在脚本中有效,@eckes 示例中不是这种情况。 你是对的。我提到它需要是一个高级功能,但并不是说你必须对脚本做同样的事情。【参考方案4】:

有一种更简单的方法可以在 ISE 中设置所需的参数:

在 ISE 中按 F5 之前,设置您需要的参数。我通常评论我需要的参数,例如: # $G_ARCHIVE = "C:\Temp\TestFile_001.txt"

我选择“#”之后的所有内容,然后按 F8。下次我用 F5 调试脚本时,参数设置为我正在测试的值,无需通过命令行传递参数。

【讨论】:

以上是关于如何将所需的参数传递给 Powershell ISE 中的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个字符串参数传递给 PowerShell 脚本?

如何使用 Terraform local-exec 将命名参数传递给 powershell 脚本?

如何将命令行参数传递给 PowerShell ps1 文件

如何将空参数传递给 msdeploy powershell deploy 命令

PowerShell 将命名参数传递给 ArgumentList

将表作为参数传递给函数