如何使用 puppet 在 ruby 的 powershell 命令中使用正则表达式
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)
我得到了这个输出:
.. 2.1.26 ..
.. 2.1.28 ..
.. 3.1.13 ..
.. 3.1.15 ..
.. 5.0.4 ..
.. 5.0.6 ..
但是当它被 Puppet 执行时,我得到了这个输出:
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]
它没有用 Regex 进行 -replace
有谁知道为什么 Puppet 不识别 Regex 和 | 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)"})
我需要在 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)
我得到了这个输出:
.. 2.1.26 ..
.. 2.1.28 ..
.. 3.1.13 ..
.. 3.1.15 ..
.. 5.0.4 ..
.. 5.0.6 ..
但是当它被 Puppet 执行时,我得到了这个输出:
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]
它没有用 Regex 进行 -replace
有谁知道为什么 Puppet 不识别 Regex 和 | 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)"})