使用BorderAround向控制台发出“True”。
$range = $sum_wksht.Range('B{0}:G{0}' -f ($crow))
$range.BorderAround(1, -4138)
这可以通过使用以下之一来克服。
$wasted = $range.BorderAround(1, -4138)
[void]$range.BorderAround(1, -4138)
为什么需要这个?我没有正确创建范围吗?有更好的解决方法吗?
为什么需要这个?
这是必需的,因为BorderAround
method有一个返回值,并且在PowerShell中,输出(返回)数据的任何命令或表达式...
被隐式输出到其(成功)输出流,默认情况下输出到主机,通常是运行PowerShell会话的控制台窗口(终端)。
也就是说,数据显示在控制台/终端中,除非它是:
$var = ...
)... | ...
;最后一个管道段的命令可能会也可能不会产生输出)... >
)或其任何组合。
那是:
$range.BorderAround(1, -4138)
是(更有效)的简写:
Write-Output $range.BorderAround(1, -4138)
(很少需要明确使用Write-Output
。)
由于您不需要该输出,因此必须对其进行抑制,您有多种选择:
$null = ...
[void] (...)
... > $null
... | Out-Null
$null = ...
可能是最好的整体选择,因为:
[void] = (...)
也这样做,但由于语法原因,经常要求你将其余的陈述括在(...)
中;例如,[void] 1 + 2
不能按预期工作,只有[void] (1 + 2)
$null = Get-AdUser ...
)和表达式输出(例如,$null = $range.BorderAround(1, -4138)
)都表现良好。相反,避免使用... | Out-Null
,因为它通常要慢得多(除了PowerShell Core中的表达式输出)。
但是,如果你需要沉默所有output streams - 不仅仅是成功输出,还有错误,详细输出,...... - 你必须使用*> $null
cmd.exe
或Bash。 (虽然传统的shell有2个输出流 - stdout和stderr - PowerShell有6个,以便提供更复杂的功能 - 请参阅about_Redirection。)
cmdlet,脚本或函数可以根据需要随时写入输出流,并且此类输出通常可立即显示,但也可显示给潜在的消费者,这使得管道提供的流式传输,逐个处理。
这与传统编程语言形成对比,传统编程语言的输出行为基于返回值,通常通过return
关键字提供,该关键字将输出数据(返回值)与流控制混合(退出范围并返回调用方)。
一个常见的陷阱是期望PowerShell的return
声明行为相同,但事实并非如此:return <val>
只是<val>; return
的语法糖,即<val>
的隐含输出,然后无条件地将控制权返回给调用者;值得注意的是,使用return
并不排除在相同范围内从早期语句生成输出。echo
相对应,即Write-Output
,但很少使用它。
在Write-Output
有用的极少数情况下,使用-NoEnumerate
阻止输出集合的枚举,或使用common parameter -OutVariable
输出数据并将其捕获到变量中(通常只需要表达式,因为cmdlet和高级函数/脚本他们自己支持-OutVariable
)。
隐式输出行为:
通常是一种祝福:
对于交互式实验 - 只需键入任何语句 - 特别是包括[IO.Path]::GetExtension('foo.txt')
和[math]::Pow(2, 32)
等表达式 - 并查看其输出(类似于REPL的行为)。
用于编写不需要拼写隐含行为的简明代码(参见下面的示例)。
偶尔会陷入困境:
适用于习惯于传统编程语言语义的用户。
由于人们不期望产生输出的陈述可能会对输出流造成意外污染,例如在您的情况下;一个更典型的例子是.Add()
类的[System.Collections.ArrayList]
方法意外地产生输出。例:
# Define a function that takes an array of integers and
# outputs their hex representation (e.g., '0xa' for decimal 10)
function Get-HexNumber {
param([int[]] $numbers)
foreach ($i in $numbers) {
# Format the integer at hand
# *and implicitly output it*.
'0x{0}' -f $i.ToString('x')
}
}
# Call the function with integers 0 to 16 and loop over the
# results, sleeping 1 second between numbers.
Get-HexNumber (0..16) | ForEach-Object { "[$_]"; Start-Sleep 1 }
以上结果如下:
[0x0]
# 1-second pause
[0x1]
# 1-second pause
[0x2]
...
[0x10]
这演示了行为的流方面:Get-HexNumber
的输出在生成时可用于ForEach-Object
cmdlet调用,而不是在Get-HexNumber
退出之后。