【问题标题】:Convert to newline转换为换行符
【发布时间】:2018-02-10 18:52:58
【问题描述】:

我正在使用 powershell,并且有类似的东西

$testResult = vstest.console $myPathToUnitTests.dll

结果很好,但是有新行(换行符,如 \n )。

我想在我的 HTML 文件中使用它,并将结果按原样保存到 javascript 文件中。

$testResult = vstest.console $myPathToUnitTests.dll
$js = "const result = $($testResult);"
$js | Set-Content $myPathToJsFile

这很好用,我可以使用它。

问题是,它不显示换行符。在我尝试过的 javascript 文件中

result = result.replace(/(?:\r\n|\r|\n)/g, '<br />');

在我尝试过的 powershell 中

 $testResult = $testResult.replace("\n", "<br />")

但是,如果我在 powershell ID 中的 testResult 上放置一个断点并将鼠标悬停在我看到的变量 testResult 上

这意味着它知道有新行/换行符。我只是似乎无法坚持下去:(

【问题讨论】:

  • $testResult = $testResult -replace '\r?\n','&lt;br /&gt;'
  • 我怀疑$testResult 不是字符串而是字符串数组,这意味着您可能需要这样做:$TestResult = $TestResult -Join "&lt;br /&gt;"
  • 如果它确实考虑一个字符串:使用系统的[System.Environment]::NewLine 定义:$testResult = $testResult -replace [System.Environment]::NewLine, '&lt;br /&gt;'
  • @iRon 是这样,但总是这样吗?像这样的东西总是返回一个数组还是返回一个字符串/整数/枚举等
  • 我不知道但是如果你把它放到一个数组中(@(...)),比如$TestResult = @($TestResult) -Join "&lt;br /&gt;",这是一个 .这里需要注意的重要一点是,如果它已经是一个数组,它将保持相同的数组并且创建另一个级别(这是标准的 PowerShell 行为)。

标签: javascript powershell


【解决方案1】:

vstest.console $myPathToUnitTests.dll 返回一个 array 而不是 string 因此您需要将所有字符串(行)与@987654321 一起加入 @ 操作符,比如 html:

$TestResult -Join "<br />"

或者如果你想创建一个多行文本文件:

$TestResult -Join [System.Environment]::NewLine

注意:为此,我建议使用系统默认的换行定义([System.Environment]::NewLine)而不是硬编码的换行(如:`r`n)。

你怎么会知道这个?

您无法轻易预测未知 cmdlet 或命令返回什么,但 PowerShell 在一次处理管道中的多个对象(数组)方面非常出色,这是假设每个未知 cmdlet 或命令都可以分配给变量时,可能会返回收集在数组中的多个对象(或字符串)。 不用说,已经有几十个类似的 PowerShell StackOverflow 问题与这个问题有相同的原因。然而,相关问题本身差异太大,无法将它们标记为重复。在这些其他问题中,本机 PowerShell 命令Get-Content 可能是导致此 PowerShell 编程陷阱的最常见原因。

找出未知 cmdlet 当前返回的内容的最佳方法是使用 GetType() 方法(不适用于 $Null)或使用 PSTypeNames 属性(通常返回一个继承类型的数组):

PS C:\> (get-content .\SingleLine.txt).PSTypeNames
System.String
System.Object

但这并不能保证它总是返回相同的(单一)对象类型:

PS C:\> (get-content .\MultipleLines.txt).PSTypeNames
System.Object[]
System.Array
System.Object

事实上,(字符串)数组通常显示在多行(由 换行符分隔)直接在它们一起存放的主机上(由 空格分隔) 当它们被封装在一个字符串中时可能是识别问题的触发器:

PS C:\> $a = "a", "b", "c"
PS C:\> $a
a
b
c
PS C:\> "$a"
a b c
PS C:\>

这样的东西总是会返回一个数组吗?

cmdlet 或命令可能返回对象(字符串)或对象数组(字符串)的不确定性确实引发了一个新问题(正如您评论的那样)。
这种不确定性实际上在 PowerShell 中很容易解决;只需将输出包装在一个数组中(在括号中以 @ 开头,另见:How can I force Powershell to return an array when a call only returns one object?):

  • 如果输出还不是一个数组,它将变成一个包含单个对象(字符串)的数组
  • 如果输出已经是一个数组,它将保持完全相同的数组。

在后面的情况下,重要的是要了解没有额外的 级别被添加到结果数组中

该技术在 PowerShell 中常用:

$a = "a", "b", "c"
@($a)[0] # still returns: "a"
@(@(@($a)))[0] # or even this returns: "a"

【讨论】:

  • 多么棒的答案
猜你喜欢
  • 2011-02-15
  • 2014-08-16
  • 1970-01-01
  • 2011-07-21
  • 2013-03-03
  • 2020-01-05
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多