代码之家  ›  专栏  ›  技术社区  ›  Merrill Cook

链接的PowerShell replace命令是否逐个执行?

  •  3
  • Merrill Cook  · 技术社区  · 8 年前

    这对于专家级的regex理解来说可能不是问题。而且这也很重要,因为我正在运行多个链接的replace命令,这些命令会影响文本文件中的某些相同文本。我还设想根据分隔符(需要多次替换)在替换之前的使用方式来划分TXT文件。有了这句话,PowerShell的基本结构知识是有用的,而且我没有找到太多的资源(开放的建议!).

    问题:链接的PowerShell replace命令是否逐个执行?

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

    上面这个愚蠢的例子会产生hello:'最初的hello:'在哪里?

    通过对一些项目的研究,我认为上述方法大多数时候都有效。然而,似乎总是有一些边缘案例。这是脚本的另一个方面,还是链接命令(相当数量的命令)在never变量中执行的顺序?

    1 回复  |  直到 8 年前
        1
  •  4
  •   briantist    8 年前

    你拥有的是操作员,而不是命令。

    我说这不是学究式的,而是因为“command”在PowerShell中有特定的含义(它是一个包含函数、Cmdlet、别名、应用程序、筛选器、配置(这是一个DSC构造)、工作流和脚本的通用名称),并且因为它们可以一起使用的方式不同耳鼻喉。

    大多数运算符是以 - (但是其他的东西可以算作操作符,比如casting),并且您确实可以将它们链接在一起使用。 他们也按顺序执行。

    我需要澄清一下,他们不一定按照你说的顺序执行。 混合 操作员。同一个运算符的多个将具有相同的优先级,但您应该检查 about_Operator_Precedence 查看合并时将使用的顺序。

    请注意,有些运算符可能“短路”(听起来像是故障,但实际上不是),这是某些布尔运算符的结果,如果布尔结果不能更改,则不会对以后的操作进行评估。

    例如:

    $true -or $false
    

    在这个例子中, $false 表达式的一部分永远不会实际计算。如果表达式的下一部分是复杂的,甚至是无效的,这一点很重要。考虑这些:

    $true -or $(throw)
    $false -or $(throw)
    

    第一个会回来的 $true 因为(大概)在接下来的表达中没有什么能使它 假美元 .

    第二行必须计算第二个表达式,并且在计算时 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 被覆盖。

    如果存在边缘情况,则可能是对事件序列中的某些内容(不正确的正则表达式、不分配或使用值、不正确的逻辑等)的误解,因为操作顺序将是一致的。如果你有任何这样的边缘案件,请张贴!

    推荐文章