使用PowerShell调用带有可选参数的方法

5

我有一段Excel VBA代码,用于在工作表中查找特定单元格。它使用了Excel库中的Find方法。以下是代码:

objRange.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows)

我需要在PowerShell中做相同的事情。但是这种方法总共有9个参数。如何忽略其他可选参数在PowerShell中。就像这样?

$range.Find("*", "", "", "", $xlByRows, $xlPrevious, "", "", "")

这里Range.Find方法的文档。

2个回答

9

$null 无法使用,但是根据 这个回答,你可以使用 [Type]::Missing

$default = [Type]::Missing
$xl.Cells.Find("*", $default, $default, $default, $xlByRows, $xlPrevious,
               $default, $default, $default)

必须有一种方法来为不需要的参数提供默认值。 - Ammar
@Ammar,有没有想到一种类似于VBA的:=语法,只命名你关心的可选值的方法? - Jay Carlton
@Jay,我刚刚使用了Ansgar提供的解决方案。 - Ammar
@Jay,根据https://dev59.com/MoHba4cB1Zd3GeqPNSQg的说法,这可能是不可能的。 - irh
@irh 是的,这种事情需要语言中实际的语法支持。如果可以做到的话,我倾向于认为我们会看到如何做的示例。也许有一种方法可以构建一个FunctionWithOptionalArgumentCaller类来为我完成这个任务。也许它可以使用反射来找出可选参数的类型和默认值,并公开一个方法来设置我关心的参数。不过这似乎并不值得。 - Jay Carlton
如果您想使用命名参数,请使用以下链接:https://dev59.com/Qm035IYBdhLWcg3wPNZk @JayCarlton - Sancarn

1
我通过创建重载方法来解决这个问题,这些方法调用核心方法并传递我想要的值。例如,我希望用户能够指定已处理记录的数量或调用“Increment”方法,然后只需调用没有参数的“WriteProgress”方法。
class UserFeedback {
[string]$Name
[int]$ThingCount
[datetime]$ProcessStartDateTime
[int]$ProcessedCount

UserFeedback ([string] $Name,[int]$ThingCount){
    $this.ProcessStartDateTime = Get-Date
    $this.Name = $Name
    $this.ThingCount = $ThingCount
    $this.ProcessedCount = 0
}

WriteProgress([int] $intProcessed){
    $this.ProcessStartDateTime        
    $SecondsElapsed = ((Get-Date) - $this.ProcessStartDateTime).TotalSeconds
    $SecondsRemaining = ($SecondsElapsed / ($intProcessed / $this.ThingCount)) - $SecondsElapsed
    Write-Progress -Activity $this.Name -PercentComplete (($intProcessed/$($this.ThingCount)) * 100) -CurrentOperation "$("{0:N2}" -f ((($intProcessed/$($this.ThingCount)) * 100),2))% Complete" -SecondsRemaining $SecondsRemaining
}

WriteProgress(){
    $this.WriteProgress($this.ProcessedCount)
}

Increment(){
    $this.ProcessedCount ++    
}

}


老方法是最好的方法,这是一个比其他方案更优雅的不错实用解决方案 - 感谢提醒。 - Oly Dungey

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