PowerShell中Replace后用管道报错?如何正确实现替换后拆分字符串
搞定PowerShell的ExpressionsMustBeFirstInPipeline错误
嘿,我来帮你捋清楚这个问题哈。你遇到的ExpressionsMustBeFirstInPipeline错误,本质是管道用法不符合PowerShell的规则。咱们先看你写的代码:
$in = "string with spaces" $out = $in -replace 's' | $_.Split(' ')
问题出在管道|后面的$_.Split(' ')——PowerShell的管道后面必须跟着命令(比如ForEach-Object这类cmdlet),而不是直接写$_.Split()这种表达式。$_这个管道变量只有在脚本块(就是{}包裹的内容)里才会被识别为当前流经管道的对象,直接放在管道后面肯定会报错。
另外补充个小细节:$in -replace 's'本身是把字符串里所有小写s替换为空字符串,这部分是没问题的,但因为$in是单个字符串,其实根本没必要用管道,直接链式调用更简单。
给你两种正确的写法:
写法1:针对单个字符串(无需管道)
直接把-replace的结果用括号括起来,然后调用Split方法就行:
$in = "string with spaces" $out = ($in -replace 's').Split(' ') # 结果会是 @("tring", "with", "pace")
写法2:针对多个字符串(用管道处理)
如果你的输入是字符串数组,需要逐个处理的话,就得用ForEach-Object(可以简写为%)把Split操作包在脚本块里:
$in = "string with spaces", "another string here" $out = $in -replace 's' | ForEach-Object { $_.Split(' ') }
要是你原本是想把s替换成其他字符(而不是空),记得给-replace加上替换值,比如-replace 's', 'x',不然默认就是替换为空哦。
内容的提问来源于stack exchange,提问作者drouning
相关产品推荐
相关产品推荐

