为什么Range.BorderAround会向控制台发出“True”?

问题描述 投票:1回答:1

使用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)

为什么需要这个?我没有正确创建范围吗?有更好的解决方法吗?

excel powershell output
1个回答
1
投票

为什么需要这个?

这是必需的,因为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


Why does PowerShell produce output implicitly?

  • 作为shell,PowerShell的输出行为基于流,如传统的shell,如cmd.exe或Bash。 (虽然传统的shell有2个输出流 - stdout和stderr - PowerShell有6个,以便提供更复杂的功能 - 请参阅about_Redirection。) cmdlet,脚本或函数可以根据需要随时写入输出流,并且此类输出通常可立即显示,但也可显示给潜在的消费者,这使得管道提供的流式传输,逐个处理。 这与传统编程语言形成对比,传统编程语言的输出行为基于返回值,通常通过return关键字提供,该关键字将输出数据(返回值)与流控制混合(退出范围并返回调用方)。 一个常见的陷阱是期望PowerShell的return声明行为相同,但事实并非如此:return <val>只是<val>; return的语法糖,即<val>的隐含输出,然后无条件地将控制权返回给调用者;值得注意的是,使用return并不排除在相同范围内从早期语句生成输出。
  • 与传统shell不同,PowerShell不需要显式的写入输出流命令来生成输出: 虽然PowerShell确实与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退出之后。

© www.soinside.com 2019 - 2024. All rights reserved.