假设我有以下内容:
$CUBE_input = "ABC; DEF"
如果执行以下操作,
$($($CUBE_input.ToUpper() -split ';' -replace '(^\s+|\s+$)','' -replace '\s+',' ')[0])
我得到了ABC
,使用[1]
,我得到了DEF
(由于正则表达式,没有前导空格),正如预期的那样
然而,如果我没有分号来分隔字符串,例如:
$CUBE_input = "ABC"
并再次执行此操作:$($($CUBE_input.ToUpper() -split ';' -replace '(^\s+|\s+$)','' -replace '\s+',' ')[0])
我回来了A
我需要使它无论是否有分号分隔字符串,它只输出的话,每次没有字符。
我该如何完成这项工作?
1条答案
按热度按时间r7knjye21#
使用
(...)
而非$(...)
,即使在单一元素的情况下,也会产生字串的 * 数组 *:$(...)
,在 * 可扩展字符串*之外很少需要子表达式运算符(如果需要在"..."
字符串中嵌入表达式和命令)。在expandable strings之外,您只需要
$(...)
就可以将 * 整个陈述式 *(例如if
、do
、switch
、foreach
、...)嵌入较大的运算式或命令中,包括提供 * 陈述式 * 做为管缐的第一个区段。**若要将单一 * 运算式 * 或单一 * 命令或管缐 * 内嵌在较大的运算式或命令中,请使用群组运算子
(...)
,以避免 *$(...)
***的副作用-请参阅下文。至于你试过什么:
$(...)
将 * 管道 * 输出逻辑应用于所包含的语句,这意味着:**枚举*表达式产生的数组,然后 * 根据情况 * 将输出对象 * 收集 * 到:
[object[]]
数组,用于 *2个或更多 * 输出对象@()
,即数组子表达式运算符,则 * 始终 * 获得[object[]]
数组)因此,通过使用
$(...)
,由-split
产生的单元素数组(并由-replace
操作保存)被有效地 * 展开 *,元素本身-字符串'ABC'
-被返回,并且对 * 字符串 * 应用索引提取它们的各个字符;例如'ABC'[0]
返回'A'
。请注意,上面的内容还暗示了一个2+元素的数组是 * 强类型 *,它被
$(...)
转换为一个新的[object[]]
数组;例如:相比之下,
(...)
会传回表示式的值: