这可能不是专家正则表达式理解的问题。唯一重要的是因为我正在运行多个链式替换命令,这些命令会影响文本文件中的某些相同文本。我还想象基于在替换之前如何使用分隔符单词(需要多次替换)来分区txt文件会有所帮助。有了这个说PowerShell的基本结构知识是有用的,我没有找到很多很好的资源(对建议开放!)。
问题:链接的powershell替换命令是否一个接一个地执行?
-replace "hello:","hello " `
-replace "hello ","hello:"
} | out-file ...
上面这个愚蠢的例子会不会产生问题:' s最初是你好的地方:' s?
从完成一些项目开始,我认为上述工作大部分时间都有效。但似乎总有一些边缘情况。这是脚本的另一个方面,还是链接命令(它们的相当数量)在永不变量中执行的顺序?
答案 0 :(得分:4)
你拥有的是操作员,而不是命令。
我说这不是迂腐,而是因为“命令”在PowerShell中具有特定含义(它是包含函数,cmdlet,别名,应用程序,过滤器,配置(这是DSC构造)的通用名称,工作流程,和脚本),因为它们可以一起使用的方式不同。
大多数运算符都是以-
开头的保留字(但其他东西算作运算符,比如转换),你确实可以将它们链接在一起使用。 它们也按顺序执行。
我需要澄清;它们不一定按照 mix 运算符时给出的顺序执行。多个相同的运算符将因为它们都具有相同的优先级,但您应该检查about_Operator_Precedence以查看组合它们时将使用的顺序。
请注意,某些运算符可能会“短路”(这可能听起来像是故障,但事实并非如此),这是某些布尔运算符的结果,如果布尔结果无法更改,则不会对以后的运算进行求值。 / p>
例如:
$true -or $false
在此示例中,表达式的$false
部分永远不会被实际评估。如果表达式的下一部分很复杂甚至无效,这一点很重要。考虑这些:
$true -or $(throw)
$false -or $(throw)
第一个将返回$true
,因为(可能)即将到来的表达式中没有任何内容可以使$false
。
第二行必须评估第二个表达式,并且这样做throw
是一个异常,暂停程序。
所以,除此之外,是的,您可以继续为您的运营商排队。如果操作符本身在末尾,您也不需要在行尾的行继续符(反引号`
)。布尔运算符更有用:
$a -and
$b -or
$c -xor
$false
像替换这样的东西有点尴尬:
'apple' -replace
'p',
'z'
关于这个:
唯一重要的是因为我正在运行多个链式替换 影响文本文件中某些相同文本的命令。
这些操作符不接触文件中的任何内容,它们正在处理内存中的数据,作为脚本中的文字或变量(然后你用它做什么,比如写文件就是你的事)。
此外,即使这样,它也不会更改变量中已有的任何值,它会返回新值,您可以将其分配给变量或以任何其他方式使用。
$var = 'apple'
$var -replace 'p','Z'
$var
将返回替换的值,但没有对其进行任何操作,因此它将进入控制台。然后你可以看到$var
根本没有被修改,而不是:
$var = 'apple'
$var = $var -replace 'p','Z'
$var
$var
的值被覆盖的地方。
如果存在边缘情况,则可能是对事件序列中的某些事物的误解(不正确的正则表达式,不分配或使用值,不正确的逻辑等),因为操作的顺序将是一致的。如果您有任何此类边缘情况,请发布它们!