Powershell - 与模式中的变量匹配

Powershell -match with variable in pattern

希望有经验的编码人员能够解释为什么从文本文件的内容创建并添加到匹配模式的变量不起作用...但带有静态字符串的变量却起作用?

$computer = "TYMXL-F3MC012WV"

$s_01 =  (Get-Content $path\source_files\pascodes.txt -Raw).replace("`n","|") #F3MC|FRSE|FGTS
$s_02 = "F3MC|FRSE|FGTS"

$computer -match "^(TYMX|MPLS)(W|L|T|V)-($s_01)([a-zA-Z0-9]{1}).+$" #false
$computer -match "^(TYMX|MPLS)(W|L|T|V)-($s_02)([a-zA-Z0-9]{1}).+$" #true

您的文本文件可能使用 CRLF ("`r`n") 换行符而不是仅 LF ("`n") 换行符,因此仅替换后者是不够的。

避免这个问题的一个简单方法是不使用 -Raw,这样 Get-Content returns 一个 array 行,这你可以加入 |:

$s_01 = (Get-Content $path\source_files\pascodes.txt) -join '|'

请注意,Get-Content 可互换地识别 CRLF 和 LF 换行符,PowerShell 通常也是如此。


虽然您可以按如下方式修复您最初的尝试,但上述解决方案要简单得多(虽然速度较慢,但​​对于小文件来说无关紧要):

$s_01 = (Get-Content $path\source_files\pascodes.txt -Raw).Trim() `
          -replace '\r?\n' , '|'
  • 与上述 一起使用的正则表达式 \r?\n 匹配 CRLF 和 LF 换行符。

  • 首先应用
  • .Trim() 以删除任何 trailing 换行符,这样它就不会被替换为 |;请注意,这 trims 所有前导和尾随空格; trim 只是一个尾随换行符,使用 -replace '\r?\n\z' 代替(在应用上面的 -replace 操作之前)。