powershell 如何只索引整个单词?

qxgroojn  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(144)

假设我有以下内容:

$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
我需要使它无论是否有分号分隔字符串,它只输出的话,每次没有字符。
我该如何完成这项工作?

r7knjye2

r7knjye21#

使用(...)而非$(...),即使在单一元素的情况下,也会产生字串的 * 数组 *:

($CUBE_input.ToUpper() -split ';' -replace '(^\s+|\s+$)','' -replace '\s+',' ')[0]

$(...),在 * 可扩展字符串*之外很少需要子表达式运算符(如果需要在"..."字符串中嵌入表达式和命令)。

expandable strings之外,您只需要$(...)就可以将 * 整个陈述式 *(例如ifdoswitchforeach、...)嵌入较大的运算式或命令中,包括提供 * 陈述式 * 做为管缐的第一个区段。

**若要将单一 * 运算式 * 或单一 * 命令或管缐 * 内嵌在较大的运算式或命令中,请使用群组运算子(...),以避免 * $(...)***的副作用-请参阅下文。

至于你试过什么

$(...)将 * 管道 * 输出逻辑应用于所包含的语句,这意味着:
**枚举*表达式产生的数组,然后 * 根据情况 * 将输出对象 * 收集 * 到:

  • 常规[object[]]数组,用于 *2个或更多 * 输出对象
  • 数组元素 * 本身 *,如果是 * 单元素 * 数组(如果使用@(),即数组子表达式运算符,则 * 始终 * 获得[object[]]数组)

因此,通过使用$(...),由-split产生的单元素数组(并由-replace操作保存)被有效地 * 展开 *,元素本身-字符串'ABC'-被返回,并且对 * 字符串 * 应用索引提取它们的各个字符;例如'ABC'[0]返回'A'
请注意,上面的内容还暗示了一个2+元素的数组是 * 强类型 *,它被$(...)转换为一个新的[object[]]数组;例如:

PS> $([string[]] ('a', 'b')).GetType().Name
Object[] # !! $(...) enumerated the array and 
         # !! collected the elements in a new [object[]] array

相比之下,(...)会传回表示式的值:

PS> ([string[]] ('a', 'b')).GetType().Name
String[] # OK: (...) preserved the array as-is

相关问题