在Powershell脚本中添加换行符

ryevplcw  于 2023-01-30  发布在  Shell
关注(0)|答案(3)|浏览(285)

我有一个在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;

  # ...

}
bxfogqkk

bxfogqkk1#

  • $str_msg = $file,[System.IO.File]::ReadAllText($file.FullName)不会创建一个 string,它创建了一个2元素的 array[object[]]),由$file[System.IO.FileInfo]示例和包含该文件内容的字符串组成。
  • 据推测,.AddMsg()方法需要单个字符串,因此PowerShell将数组字符串化,以便将其转换为单个字符串;**默认情况下,PowerShell通过 * 串联元素(以单个空格作为分隔符)***来字符串化数组;例如:[string] (1, 2)产生'1 2'

因此,最好$str_msg组成一个 string 作为开始,并使用一个显式换行符作为分隔符,例如:

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

注意,转义序列"rn"用于生成CRLF(Windows特有的换行符序列);在类Unix平台上,您只需使用"n"(LF)。 .NET提供了一个跨平台抽象[Environment]::NewLine,它返回适合平台的换行符序列(您也可以将其作为$([Environment]::NewLine)嵌入"..."中)。 字符串插值的替代方法是使用字符串格式设置运算符-f,它基于.NETString.Format()`方法:

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

ujv3wf0j2#

在PS中,使用Backtick-r+backtick-n会在新行中执行回车。您可以将$file变量作为新的数组变量执行Get-Content操作,并在特定索引处插入回车:
示例文件:test123.txt
如果文件内容如下:

line1
line2
line3

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

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

要在第2行和第3行之间添加回车符:

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

然后输出一个新文件:

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

7tofc5zh3#

您需要使用回车符powershell特殊字符,即“′ r”。
像这样使用它在行中添加回车符:

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

检查this documentation以获得关于Poewershell特殊字符的更多详细信息。

相关问题