【问题标题】:How do i allow powershell to accept an empty string for a named parameter?如何允许 powershell 接受命名参数的空字符串?
【发布时间】:2018-05-01 23:00:10
【问题描述】:

我正在调用一个 powershell 脚本:

powershell.exe -file basic.ps1 -User ""

我还有其他参数,这个有点淡了。

PS 脚本接受参数:

[CmdLetBinding()]
param(
 [Parameter(Mandatory=$true)]
[AllowEmptyString()]
[string]$User = 't'
)

当我运行命令时,我得到:

缺少参数“用户”的参数。指定“System.String”类型的参数,然后重试。

我假设AllowEmptyString 会允许这样做?

【问题讨论】:

  • 如果你想让它为空,为什么要强制参数?您稍后在脚本中对变量做了什么?
  • 不要从cmd.exe 运行您的脚本。 (为什么?)从 PowerShell 提示符运行它。
  • 它在 cmd.exe 中工作,在 powershell propmt 中不起作用。
  • 这是强制性的,因为我无法控制调用脚本。它总是会传递这些值,然后我需要进一步了解它是否是一个空字符串——在这种情况下,空字符串是一个有效值。它现在根据下面的答案工作

标签: powershell


【解决方案1】:

听起来您根本不需要强制参数。使其成为强制性将需要输入,这使得默认值无用。但是,让我们回到您描述的错误。

该属性按预期工作。问题是你如何调用你的脚本。让我们尝试以下代码作为函数和脚本:

[CmdLetBinding()]
param(
[Parameter(Mandatory=$true)]
[AllowEmptyString()]
[string]$User = 't'
)

"`$User has value '$user'. Is it null? $($user -eq $null). Type is $($user.GetType().Name)"

演示:

#Inside a function
PS> t -User ""
$User has value ''. Is it null? False. Type is String

#Inside a script
PS> .\Untitled-5.ps1 -User ""
$User has value ''. Is it null? False. Type is String

#Running the following command from cmd
cmd> powershell.exe -file Untitled-5.ps1 -User "" 
$User has value ''. Is it null? False. Type is String

但是,当您在 PowerShell 会话中运行最后一行时,PowerShell 将解析字符串,从而导致参数为空值(无引号)。

PS> powershell.exe -file Untitled-5.ps1 -User "" 
D:\Downloads\Untitled-5.ps1 : Missing an argument for parameter 'User'. Specify a parameter of type 'System.String' and
 try again.
    + CategoryInfo          : InvalidArgument: (:) [Untitled-5.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument,Untitled-5.ps1

Powershell.exe 不适合在 PowerShell 进程中使用。您可以通过直接在 PowerShell 进程中调用脚本(第二个示例)、从 cmd/run/scheduled task ++(其他任何地方)运行 PowerShell.exe … 或确保 PS 不解析您的参数来解决此问题,因此它实际上会输入引号。

这可以通过转义引号来完成

PS> powershell -File Untitled-5.ps1 -User `"`"

或者使用--%

PS> powershell -File Untitled-5.ps1 --% -User ""

【讨论】:

  • 它是从导致问题的 powershell 会话中运行的。我是这样运行它进行测试的,但是当从 cmd 运行它时它运行完美
  • “--%”是做什么的?它似乎对我的问题没有任何影响
  • 这是一个“停止解析”符号/运算符 (PS3+)。它使 powershell 将命令的其余部分视为文字字符串。换句话说,它后面的arguments++不会使用变量和表达式,而是简单地写e.g. $我的变量名。 --% 不会被执行的脚本/可执行文件看到,它只是为了执行你的命令的引擎。
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
相关资源
最近更新 更多