【发布时间】:2019-03-12 16:35:02
【问题描述】:
我正在传递$users 的数组。
代码:
$y = @()
$y = "Create Users process. Run started at $('[{0:MM/dd/yyyy} {0:HH:mm:ss}]' -f (Get-Date))"
foreach ($x in $users) {
$y += "User $($x.DisplayName) with NNN of $($x.ID)"
}
$y += "Completed at $('[{0:MM/dd/yyyy} {0:HH:mm:ss}]' -f (Get-Date))"
$y | Out-File "Log.txt"
$y 现在是一个未格式化的字符串数组。当我在屏幕上输入$y 时,它看起来很棒。
如果我将它定向到Format-Table,它看起来很棒(没有标题)。
当我将它输出到一个文件并在命令提示符 (cmd.exe) 处键入该文件时,它看起来很棒。
但是,当我在记事本中将其拉起时,所有输出都显示在一行上。准确地说,所有数据都在那里,没有丢失任何数据行,但没有 CR/LF,因此当使用 Notepad.exe 查看时,所有数据都显示在文件中的一行上。
【问题讨论】:
-
请改用
Add-Content、Set-Content。可能这只是一个编码问题。out-file -Encoding ascii应该也会为您提供您所寻求的结果。 -
第二行
$y = ....搞砸了您在这里尝试做的事情。当您设置$y = @()时,您将创建一个空数组。当您设置$y = "something"时,您将类型从数组更改为字符串。您稍后执行的每个+=操作仍在创建一个新的string 而不是一个新的array。如果要使用此方法,则需要将$y转换为数组 ([array]$y += "something"),或者在第一次声明后的每个赋值中使用+=永远不要更改类型。 -
"out-file -encoding ascii" 试了下没有解决问题。但是现在我一定遇到了一些奇怪的事情,因为今天,我无法使用我附加的代码示例重现结果。但我发誓我有这个问题,否则我根本不需要发帖。
-
确实,问题与编码无关;真正的问题已经在 @AdminOfThings 的评论中解释过了,并且很容易被复制:
$y = @(); $y = 'first'; $y += 'second'; $y输出'firstsecond',即一个单个字符串,因为尽管有first将$y创建为array ($y = @()),下一个赋值$y = 'first'将其转换为string,然后+=执行字符串连接,而不是数组构建。
标签: arrays powershell newline