powershell 将原始/空格分隔文本转换为数组

pobjuy32  于 2023-02-04  发布在  Shell
关注(0)|答案(1)|浏览(143)

我正在使用RAW文本文件,我需要拆分并创建一个数组。RAW文本文件基于参数生成。$列表从另一个程序发送。我的PS代码:

param($list)
$path="C:\BU\test\"
New-Item $path\test.txt
Set-Content $path\test.txt "$list" --> Output RAW data Eg:(Apple Orange Kiwi)
$list2=get-Content C:\BU\test\test.txt
$cd=$list.Replace(' ',', ')   
New-Item $path\cd.txt
Set-Content $path\cd.txt "$cd"  
$cd=get-Content C:\BU\test\cd.txt  Output CD Data (Apple, Orange, Kiwi)

我假设如果我使用write-host调用$cd[0],输出应该是Apple,但当我调用$cd[0]时,只得到A。我错过了什么?谢谢您的建议。

js81xvg6

js81xvg61#

看起来您最终尝试使用-split操作符来完成此操作:

$list = 'Apple Orange Kiwi'
# Split $list into an array of tokens by whitespace.
$cd = -split $list # -> equivalent of @('Apple', 'Orange', 'Kiwi')

至于你所尝试的

  • 默认情况下,Get-Content * 逐行 * 读取文件。
  • 您的输入文件只包含 * 一 * 行,其中包含逐字的Apple, Orange, Kiwi
  • 由于PowerShell从命令收集流输出的方式,$cd=get-Content C:\BU\test\cd.txt将该行存储为变量$cd中的 * string *,而 * not * 存储为包含该行作为其(唯一)元素的 * array *。
  • 索引到 * string * 返回指定位置的 * characters *,如您所见:
$line = 'Apple, Orange, Kiwi'
$line[0] # -> 'A', i.e. the *first character* of the string
  • 要确保Get-Content * 总是 * 返回一个 * 数组 *,可以使用数组子表达式运算符@(...)
# $cd[0] then always returns the *first line*.
$cd = @(Get-Content C:\BU\test\cd.txt)
  • 或者,使用[array] * 类型约束 * 接收变量
# [array] is the same as [object[]]
[array] $cd = Get-Content C:\BU\test\cd.txt

有关详细信息,请参见this answer

相关问题