- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
交互式 PowerShell session 会在省略必需参数时提示用户。 Shay Levy offers a workaround到这个问题。问题是当您使用管道绑定(bind)参数时,解决方法不起作用。
考虑这个例子:
function f {
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeLineByPropertyName=$true)]
[ValidateNotNullOrEmpty()]
[string]$a=$(throw "a is mandatory, please provide a value.")
)
process{}
}
$o = New-Object psobject -Property @{a=1}
$o | f
尽管 $o.a
是绑定(bind)到 f -a
的完美值,但它会引发异常。出于某种原因,PowerShell 会评估参数 $a
的默认值,即使 $a
的值注定要从管道绑定(bind)。
在交互式运行时缺少必需参数时,是否有其他方法可以强制 PowerShell 抛出异常?
为什么这很重要?它浪费了程序员的时间。方法如下:
堆栈跟踪深度为 20 次调用是很正常的。当调用堆栈深处的调用由于未收到强制参数而阻塞时,调试起来效率非常低。没有堆栈跟踪,没有错误消息,也没有上下文。您所看到的只是参数值的提示。祝你好运,猜到为什么会这样。您始终可以通过调试找到解决方案,只是花费的时间比应有的多,因为您没有获得通常从抛出的异常中获得的信息。
假设您正在运行一系列配置测试用例,并且 1000 个中有 一个 有这个问题。平均而言,这些测试用例中有 500 个没有运行。因此,在此测试运行中,您只能获得一半案例的测试结果。如果这些测试运行通宵运行,您可能需要再等 24 小时才能获得结果。所以现在你的迭代速度变慢了。
最佳答案
这不起作用的原因是管道参数具有不同的值,具体取决于您是在 Begin{}
、Process{}
还是 End {}
block 。在某些时候,默认值会被评估,因此会抛出异常。这是我不喜欢那个特别技巧的原因之一。
I liked it so much I wrote a blog post about it所以我希望你觉得它有用。
function Validate-MandatoryOptionalParameters {
[CmdletBinding()]
param(
[Parameter(
Mandatory=$true
)]
[System.Management.Automation.CommandInfo]
$Context ,
[Parameter(
Mandatory=$true,
ValueFromPipeline=$true
)]
[System.Collections.Generic.Dictionary[System.String,System.Object]]
$BoundParams ,
[Switch]
$SetBreakpoint
)
Process {
foreach($param in $Context.Parameters.GetEnumerator()) {
if ($param.Value.Aliases.Where({$_ -imatch '^Required_'})) {
if (!$BoundParams[$param.Key]) {
if ($SetBreakpoint) {
$stack = Get-PSCallStack | Select-Object -Index 1
Set-PSBreakpoint -Line $stack.ScriptLineNumber -Script $stack.ScriptName | Write-Debug
} else {
throw [System.ArgumentException]"'$($param.Key)' in command '$($Context.Name)' must be supplied by the caller."
}
}
}
}
}
}
我认为这样做的最大优势在于无论您有多少参数或它们的名称是什么,它都会以相同的方式被调用。
关键是你只需要为每个以Required_
开头的参数添加一个别名。
function f {
[CmdletBinding()]
param(
[Parameter(
ValueFromPipeline=$true
)]
[Alias('Required_Param1')]
$Param1
)
Process {
$PSBoundParameters | Validate-MandatoryOptionalParameters -Context $MyInvocation.MyCommand
}
}
根据我们的聊天对话和您的用例,我设置了一个断点而不是抛出异常。似乎它可能有用,但不确定。帖子中有更多信息。
也可用作 GitHub Gist (包括基于评论的帮助)。
我认为您要解决此问题的唯一方法是检查流程 block 中的值。
Process {
if (!$a) {
throw [System.ArgumentException]'You must supply a value for the -a parameter.'
}
}
如果您控制脚本的调用,您可以使用 powershell.exe -NonInteractive
并且应该抛出(或至少退出)而不是提示。
function Validate-Parameter {
[CmdletBinding()]
param(
[Parameter(
Mandatory=$true , #irony
ValueFromPipeline=$true
)]
[object]
$o ,
[String]
$Message
)
Begin {
if (!$Message) {
$Message = 'The specified parameter is required.'
}
}
Process {
if (!$o) {
throw [System.ArgumentException]$Message
}
}
}
# Usage
Process {
$a | Validate-Parameter -Message "-a is a required parameter"
$a,$b,$c,$d | Validate-Parameter
}
关于powershell - 如果省略了必需的 *pipeline* 参数,是否可以强制 PowerShell 脚本抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600279/
这是我在这里的第一篇文章,也是我第一次使用 C++。我正在查看从 Internet 获得的一些代码,但我对此有疑问。 它有一个 for 循环,像这样: for(cin >> t;t--;) 我明白它在
我目前正在开发一个网站,除其他外,该网站允许用户通过显示或隐藏他们已购买的商品来过滤市场。这适用于基本的 AJAX 调用,该调用传递可用过滤器的当前条件,然后使用 CodeIgniter 的事件记录构
我创建了一个 MWE,其中通过添加 来更改单行解决编译器错误。 以下代码无法编译: import java.util.List; public class MainClass { publi
当我想测试一些 PostgreSQL 函数 FOO() 的行为时,我发现执行类似 SELECT FOO(bar) 的查询很有用,bar一些数据我用作直接输入,而无需从真实表中SELECT。 我读到我们
在 PHP、Java、C++(以及许多其他语言)中,for 循环是这样使用的: for(int i=0;i<10;i++) 如果我已经初始化了i,我该如何省略初始化语句呢? 最佳答案 在 Java、C
我发现我们的 Android 应用出现了一个奇怪的问题,特别是在 4.4 版的 Moto X 上。 在偏好 Activity 中,所有标题的前 8 个字符都在开头用省略号截断。这也发生在溢出菜单和整个
我有一个 XElement,我必须解析它以删除结束标记中的空白。我的代码如下所示: var stringBuilder = new StringBuilder(); using (var string
假设我有两个接口(interface),X和 Y ,它们共享一些字段,但也有独立的字段: interface X { abc: number; foo: number; bar: numb
我有这个模型: var accountSchema = new mongoose.Schema({ 'seeker': { 'fullName': String,
我在 R 中运行一个具有大量时间和位置固定效应的回归。我尝试将一个漂亮的汇总表输出到 Latex 中。我从 stargazer 包切换到 huxtable,因为 stargazer 在忽略固定效果时表
假设我有一个数据框: a df a b c d 1 0 9 10 2 1 10 13 3 NA 11 14 4 3 NA 7 5 4 13 22 现在假设我
我在 R 中运行一个具有大量时间和位置固定效应的回归。我尝试将一个漂亮的汇总表输出到 Latex 中。我从 stargazer 包切换到 huxtable,因为 stargazer 在忽略固定效果时表
我想删除一个属性并返回一个新对象而不改变原始对象。 我知道我们可以像这样使用 Lodash 轻松做到这一点: const profile = { name: 'Maria', age: 30 } _.
我正在通过更改一些内容来修改 javascript 对象。当我重新创建它时,我会得到每个 key 对的索引号。 "0":{...},"1":{...}, 如何删除/省略这些 0、1、2、3、4 数字的
我正在一个非常方便且名称丰富的网站 here 上完成示例之一。 ,具体来说: func applyMutliplication(value: Int, multFunction: Int -> Int
这个问题在这里已经有了答案: Why do java source files require package declarations? (4 个答案) 关闭 6 年前。 我是 Java 的新手,
在下面的代码中: Widget makeWidget() { return Widget(); } void foo(Widget widget) { ... } foo(makeWid
这是我使用下面的调用调用的过程: CALL abc('01-04-2011','14-04-2014','28,29,36,37,38','33,34,35,41,42,43') 但问题是下面提到的查
嘿,我正在寻找一种在 yui 数据表中省略文本的好方法。我的意思是,格式化文本,使其很好地适合其单元格,并且如果文本必须被 chop ,则在其后面有一个椭圆 (...)。 我想在不使用 CSS 选择器
我有一个如下表(记录)。 ID Status AA124 Pass AA125 Pass Z_AA134 Fail Z_AA135
我是一名优秀的程序员,十分优秀!