如何在powershell命令中使用Regex,并使用puppet使用ruby



我需要在puppet中创建一个事实,以获取服务器中安装了哪些版本的.netcore。

Facter.add('common_dotnetcore_version') do
confine :kernel => 'windows'
powershell = 'C:Windowssystem32WindowsPowershellv1.0powershell.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 FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.28 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.26 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.28 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.13 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.15 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.4 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.6 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.26 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 3.1.13 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 5.0.4 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 5.0.6 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.13 [C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.4 [C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App]

它没有用Regex 进行替换

有人知道为什么Puppet不认识Regex和|select-Unique吗?

问题是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)"})

最新更新