如何在Powershell ISE中向脚本传递所需参数?

89

请见标题。

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

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

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

6个回答

91

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


8
由于我的文件路径中有空格,因此这种方法对我不起作用,解决办法是使用以下方式中的“&符号函数”:PS C:\Windows> &("c:\my folder\script.ps1") -myArg 123 -anotherArg abc - Emil G
4
你实际上可以使用相对路径:.\script.ps1 - Ashraf Alam

35
  1. 打开Windows Powershell ISE中的脚本(myscript.ps1)
  2. 在要检查(调试)的变量处按下F9。例如,下面示例中分配$outputText变量的第二行
  3. 在shell窗口中提供脚本的相对路径以及param值。例如:.\myscript.ps1 "my value"
  4. 按回车键(不需要按F5
  5. 您将能够看到用黄色突出显示的调试断点。将光标放置在要检查的变量上,以查看当前值。

一个展示使用ISE和命令参数的PowerShell调试示例


2
这个答案与被接受的答案有何不同? - eckes
9
提供更多细节和插图可以帮助其他人理解。例如,需要提供相关(或绝对)位置,而这在一开始并没有提供。 - Ashraf Alam
1
这个答案应该被采纳,因为它实际上解释了该怎么做,并展示了两个窗格。我可以使用这个答案,另一个我没有理解得足够好,不知道该怎么做。 - undefined

19

还有一种方法。您可以使用自动变量$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
}

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

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

$PSDefaultParameterValues 的其他用例可能是定制,例如使 Get-History 仅获取最后10个条目,除非您在命令中指定了 -Count 参数。因为条目只保留在当前会话中,所以您需要将自定义添加到您的配置文件。您可以在提示符下输入 Get-Help about_Parameters_Default_Values 或在TechNet上查看相同信息的更多内容。


另一个脚本块示例。您可以让脚本自动使用最新的zip文件。 $ PsDefaultParameterValues = ["ExampleScript.ps1:G_ARCHIVE"] = {(ls * .zip | sort lastwritetime | select -last 1) .fullname} 当您不断创建某些外部数据集的新版本以测试和调试脚本时,这种方法非常有用。 - PatrickFranchise
$PSDefaultParameterValues.Item("KEY") = "VALUE" 是另一种选择。 - RichardOD
1
只有在使用[Parameter()]装饰器声明参数时,它才能在脚本中正常工作,而这在@eckes的示例中并不适用。 - Laurent CAPRANI
你说得对。我提到它需要是一个高级函数,但并没有要求你用脚本做同样的事情。 - PatrickFranchise

2

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

在按下F5之前,设置您需要的参数。我通常会注释掉我需要的参数,例如: # $G_ARCHIVE = "C:\Temp\TestFile_001.txt"

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


1

Powershell 5.1 ISE中,当您按下F5运行带参数的脚本时,您将被要求逐个输入参数的值。

使用$PSDefaultParameterValues填充变量时,您可以通过$psISE变量引用已加载的脚本。

$PSDefaultParameterValues.add("$($psISE.CurrentFile.DisplayName):G_ARCHIVE","test")

0
今天我遇到了这个问题。经过一番折腾,我发现下面的面板正在运行调试模式,例如提示 '[Dbg]: PS'
我停止了调试并重新使用参数发出了我的脚本。 例如:./myScript.ps1 -ForceBuild $true

我的结果是脚本启动并且断点触发,如预期一样允许我进行调试。


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