lit*_*lit 2 excel powershell output
使用 BorderAround 会向控制台发出“True”。
$range = $sum_wksht.Range('B{0}:G{0}' -f ($crow))
$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
这可以通过使用以下方法之一来克服。
$wasted = $range.BorderAround(1, -4138)
[void]$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?我没有正确创建范围吗?有更好的解决方法吗?
为什么需要这个?
这是需要的,因为BorderAround方法具有一个返回值,并在PowerShell中,任何命令或表达...其输出(返回)的数据是隐式地输出到(成功)的输出流,它默认转到宿主,其通常为控制台PowerShell 会话在其中运行的窗口(终端)。
也就是说,数据显示在控制台/终端中,除非是:
$var = ...)... | ...;最后一个管道段的命令可能会也可能不会本身产生输出)... >)或其任何组合。
那是:
$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
是(更有效的)简写:
Write-Output $range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
(Write-Output很少需要显式使用。)
由于您不想要该输出,因此您必须抑制它,您有多种选择:
$null = ...
[void] (...)
... > $null
... | Out-Null
$null = ...可能是最好的整体选择,因为:
它传达的意图压制前起来
[void] = (...)确实太,往往需要您附上的表达在(...)句法原因; 例如,[void] 1 + 2不能按预期工作,只是[void] (1 + 2);同样,命令必须始终包含在(...); [void] New-Item test.txt不起作用,只能起作用[void] (New-Item test.txt)。它在命令输出(例如$null = Get-AdUser ...)和表达式输出(例如$null = $range.BorderAround(1, -4138))方面表现良好。
相反,避免... | Out-Null,因为它通常要慢得多(除了在 PowerShell (Core) 6+ 中无副作用的表达式输出的边缘情况)[1]。
但是,如果您需要使所有 输出流静音- 不仅是成功输出,还有错误、详细输出...... - 您必须使用*> $null
作为shell,PowerShell 的输出行为基于流,就像在传统 shell 中一样,例如cmd.exe或 Bash。(虽然传统 shell 有2 个输出流 - stdout 和 stderr - PowerShell 有6 个,以便提供更复杂的功能 - 请参阅about_Redirection。)
cmdlet、脚本或函数可以根据需要随时写入输出流,并且此类输出通常可立即用于显示,但特别是对潜在使用者也可使用,这可实现管道提供的流式、一对一处理.
这与传统的编程语言形成对比,后者的输出行为基于返回值,通常通过return关键字提供,它将输出数据(返回值)与流控制(退出作用域并返回到调用者)混为一谈。
return语句执行相同的操作,但事实并非如此:return <val>只是 for 的语法糖<val>; return,即隐式输出 of<val>后跟无条件将控制权返回给调用者;值得注意的是,使用的return确实不是来自同一范围先前的发言预先排除代输出。与传统的 shell 不同,PowerShell不需要显式的 write-to-the-output 流命令来生成输出:
虽然 PowerShell 确实有一个对应的echo,即Write-Output,但很少需要使用它。
Write-Output有用的是防止在输出上枚举集合-NoEnumerate,或者使用公共参数 -OutVariable来输出数据并在变量中捕获它(通常只需要表达式,因为 cmdlet 和高级函数/脚本本身支持-OutVariable)。该隐含输出行为:
通常是一种祝福:
[IO.Path]::GetExtension('foo.txt')and 之类的表达式[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 }
Run Code Online (Sandbox Code Playgroud)
以上产生以下结果:
$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
这演示了行为的流方面:Get-HexNumber的输出可用于ForEach-Objectcmdlet 调用,因为它正在生成,而不是在 Get-HexNumber退出之后。
[1] 在 PowerShell (Core) 6+ 中,Out-Null如果唯一前面的管道段是无副作用的表达式而不是方法或命令调用,则进行了优化;例如,1..1e6 | Out-Null几乎立即执行,因为该表达式似乎甚至没有执行。但是,这样的场景是非典型的,功能上等效的 Write-Output (1..1e6) | Out-Null需要很长时间才能运行,比$null = Write-Output (1..1e6).
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |