我有一个在Powershell中运行的脚本,我希望能够在脚本名称和脚本内容本身之间的结果文本文件输出中添加一行。
当前,从下面开始,行$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;
# ...
}
答案 0 :(得分:2)
$str_msg = $file,[System.IO.File]::ReadAllText($file.FullName)
不会创建 string ,它会创建2个元素的 array ({{1 }}),由[object[]]
$file
实例和包含该文件内容的字符串组成。
大概是[System.IO.FileInfo]
方法需要一个字符串,因此PowerShell stringify 数组可以将其转换为单个字符串。 默认情况下,PowerShell通过用单个空格作为分隔符将元素连接起来 ,对数组进行字符串化;例如。:
.AddMsg()
产生[string] (1, 2)
。
因此,最好以{em>字符串开头'1 2'
,以明确的换行符作为分隔符,例如:
$str_msg
请注意使用转义序列$strMsg = "$file`r`n$([System.IO.File]::ReadAllText($file.FullName))"
来生成CRLF(Windows特定的换行序列);在类似Unix的平台上,您只需使用"`r`n"
(LF)。
.NET提供了跨平台抽象"`n"
,该抽象返回平台适用的换行序列(您也可以将[Environment]::NewLine
嵌入$([Environment]::NewLine)
内)。
字符串内插的一种替代方法是使用{。{1}},这是基于.NET "..."
方法的字符串格式运算符:
-f
答案 1 :(得分:1)
为第一个答案欢呼
Backtick-r + backtick-n将在PS中用新行返回回车符。您可以将$ 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
希望这种替代方法可以帮助将来的求职者
答案 2 :(得分:0)
您需要使用回车符 powershell特殊字符,即“`r”。
使用它在行中添加回车符:
$str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);
选中this documentation,以获取有关Poewershell特殊字符的更多详细信息。