簡體   English   中英

如何在 powershell 命令中使用正則表達式和 ruby 使用木偶

[英]how do I use Regex in powershell commands with ruby using puppet

我需要在 puppet 中創建一個事實,以獲取服務器中安裝了哪些版本的 .netcore。

Facter.add('common_dotnetcore_version') do
  confine :kernel => 'windows'
  powershell = 'C:\Windows\system32\WindowsPowershell\v1.0\powershell.exe'
  setcode do
    dotnetVersion = Hash.new 
    if Facter::Util::Resolution.which('dotnet')
      dotNetList = Facter::Core::Execution.exec(%Q{#{powershell} -command "(((dotnet --list-runtimes ) -replace '(?!\d*\.\d*)[A-Za-z([():\]\\)]') | select -Unique)"})
      dotNetList.each_line { |line| dotnetVersion[line] = true }
    end
    dotnetVersion
  end
  
end

請注意,當我在 PowerShell 中運行此命令時

(((dotnet --list-runtimes ) -replace '(?!\d*\.\d*)[A-Za-z([():\]\\)]') | select -Unique)

我得到了這個 output:

.. 2.1.26  ..
.. 2.1.28  ..
.. 3.1.13  ..
.. 3.1.15  ..
.. 5.0.4  ..
.. 5.0.6  ..

但是當它被 Puppet 執行時,我得到了這個 output:

Microsoft.AspNetCore.All 2.1.26 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.26 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.26 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.13 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

它不是用正則表達式做 -replace

有誰知道為什么 Puppet 不能識別正則表達式和 | select - 獨一無二?

問題是 Ruby %Q{...}引用的字符串中的反斜杠是有意義的。 例如, %Q{\n}是換行符。 因此,正則表達式中的反斜杠在到達 PowerShell 之前被%Q{...}字符串解釋。

如果您查看字符串:

puts %Q{'(?!\d*\.\d*)[A-Za-z([():\]\\)]'}
# '(?!d*.d*)[A-Za-z([():]\)]'

你會看到反斜杠消失了。

最簡單的做法是通過將所有反斜杠加倍來逃避所有反斜杠:

dotNetList = Facter::Core::Execution.exec(%Q{#{powershell} -command "(((dotnet --list-runtimes ) -replace '(?!\\d*\\.\\d*)[A-Za-z([():\\]\\\\)]') | select -Unique)"})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM