【问题标题】:Adding a newline (line break) to a Powershell script向 Powershell 脚本添加换行符(换行符)
【发布时间】:2018-11-02 14:32:01
【问题描述】:

我有一个在 Powershell 中运行的脚本,我希望能够在我的结果文本文件输出中的 ccript 名称和脚本内容本身之间放置一行。

目前,从下面,$str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) 行是我需要的,但我需要一行来分隔$file 和下一个表达式的结果。我该怎么做?

foreach ($file in [System.IO.Directory]::GetFiles($sqldir,"*.sql", 
  [System.IO.SearchOption]::AllDirectories))
{
  $file = [System.IO.FileInfo]::new($file);


  $Log.SetLogDir("");
  $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName);


  $Log.AddMsg($str_msg);
  Write-Output $str_msg;


  # ...

}

【问题讨论】:

    标签: powershell newline string-interpolation


    【解决方案1】:
    • $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName) 不创建 字符串,它创建一个 2 元素 数组 ([object[]]),由$file [System.IO.FileInfo] 实例和包含该文件内容的字符串组成。

    • 大概,.AddMsg() 方法需要单个字符串,因此 PowerShell stringify 数组以便将其转换为单个字符串; 默认情况下,PowerShell 通过以单个空格作为分隔符连接元素 来对数组进行字符串化;例如。: [string] (1, 2) 产生 '1 2'

    因此,最好将$str_msg字符串开头,并以明确的换行符作为分隔符,例如:

    $strMsg = "$file`r`n$([System.IO.File]::ReadAllText($file.FullName))"
    

    注意使用转义序列"`r`n" 来生成CRLF,即Windows 特定的换行序列;在类 Unix 平台上,您只需使用 "`n" (LF)。

    .NET 提供了一个跨平台抽象,[Environment]::NewLine,它返回适合平台的换行序列(您也可以将其作为$([Environment]::NewLine) 嵌入到"..." 中)。

    字符串插值的替代方法是使用-f,它是基于.NET String.Format() 方法的字符串格式化运算符:

    $strMsg = '{0}{1}{2}' -f $file, 
                            [Environment]::NewLine, 
                            [System.IO.File]::ReadAllText($file.FullName)
    

    【讨论】:

    • 很好的答案。当我通过直接显示数组的内容在控制台中对其进行测试时,我的工作正常,但这可能只是 powershell 序列化数组的方式。这解决了OP的根本问题。
    • 谢谢@LéoD。是的,在控制台中,数组的元素在单独的行上输出,但在字符串转换/字符串插值的上下文中,工作方式不同。
    【解决方案2】:

    为第一个答案干杯

    Backtick-r+backtick-n 将在 PS 中执行回车并换行。您可以将 $file 变量的 Get-Content 作为新的数组变量,并在特定索引处插入回车:

    示例文件:test123.txt

    如果文件内容是这样的:

    line1
    line2
    line3
    

    将内容存储在数组变量中,以便获得索引

    [Array]$fileContent = Get-Content C:\path\to\test123.txt
    

    在 line2 和 line3 之间添加回车:

    $fileContent2 = $fileContent[0..1] + "`r`n" + $fileContent[2]
    

    然后输出一个新文件:

    $fileContent2 | Out-File -FilePath C:\path\to\newfile.txt
    

    希望这种替代方法可以帮助未来的答案寻求者

    【讨论】:

    • 有帮助,但请注意,单独的 CR(回车)被视为换行符(换行符) - 在 Windows 上您需要 `r`n (CRLF),和 Unix 上的 `n (LF) - 尽管 PowerShell 本身在两个平台上都可以理解这两种格式。此外,Léo D. 的回答并没有解决问题。
    • 很高兴听到它,trebleCode。我可以建议您相应地更新您的答案吗?
    【解决方案3】:

    您需要使用 回车 powershell 特殊字符,即“`r”。

    像这样使用它在你的行中添加一个回车:

    $str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);
    

    查看this documentation 了解有关 Poewershell 特殊字符的更多详细信息。

    【讨论】:

    • 感谢您的回复。我已经尝试过了,它仍然在没有新行的情况下输出。我也试过用“n”代替“r”。 $str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);
    • 单独的 CR(回车)被视为换行符(换行符)。您不是使用嵌入的换行符构建单个字符串,而是创建一个 3 元素数组 - 而使用 array 的事实正是 voot89 的问题。
    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 2011-04-11
    • 2021-12-20
    • 2014-03-31
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多