链接的powershell替换命令一个接一个地执行吗?

时间:2018-05-23 01:07:56

标签: powershell replace

这可能不是专家正则表达式理解的问题。唯一重要的是因为我正在运行多个链式替换命令,这些命令会影响文本文件中的某些相同文本。我还想象基于在替换之前如何使用分隔符单词(需要多次替换)来分区txt文件会有所帮助。有了这个说PowerShell的基本结构知识是有用的,我没有找到很多很好的资源(对建议开放!)。

问题:链接的powershell替换命令是否一个接一个地执行?

 -replace "hello:","hello " `
 -replace "hello ","hello:"
 } | out-file ...

上面这个愚蠢的例子会不会产生问题:' s最初是你好的地方:' s?

从完成一些项目开始,我认为上述工作大部分时间都有效。但似乎总有一些边缘情况。这是脚本的另一个方面,还是链接命令(它们的相当数量)在永不变量中执行的顺序?

1 个答案:

答案 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的值被覆盖的地方。

如果存在边缘情况,则可能是对事件序列中的某些事物的误解(不正确的正则表达式,不分配或使用值,不正确的逻辑等),因为操作的顺序将是一致的。如果您有任何此类边缘情况,请发布它们!