如何在Ansible中避免字符串添加额外双引号及移除现有双引号
解决Ansible中UninstallString路径多余双引号的问题
你遇到的问题是因为out.stdout_lines.0本身已经包含双引号,而在set_fact中用双引号包裹变量时,Ansible会保留原字符串的引号,再加上外层的引号,导致嵌套双引号。下面是几种可行的解决方法:
方法1:用正则替换过滤器精准移除首尾双引号
这是最可靠的处理方式,通过regex_replace过滤器只去掉字符串首尾的双引号,不会影响路径中间可能存在的合法字符:
- set_fact: uninstall_filePath: "{{ out.stdout_lines.0 | regex_replace('^\"|\"$', '') }}" - debug: var=uninstall_filePath
执行后你会得到干净的可直接使用的路径:
ok: [Myremotehost] => { "uninstall_filePath": "C:\\Program Files (x86)\\InstallShield Installation Information\\{584775F9-1696-4387-AEB5-86171F6567CC}\\Setup-x64.5.0.1.8009.exe" }
方法2:从源头处理,在PowerShell命令中移除引号
直接修改win_shell的命令,在获取UninstallString时就去掉首尾引号,后续赋值无需额外处理,从根源避免问题:
win_shell: | $uninstallEntry = Get-ItemProperty HKLM:Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | ` Where-Object { $_.DisplayName -match '{{product_name}}' } if ($uninstallEntry) { $uninstallEntry.UninstallString -replace '^"|"$', '' } register: out - set_fact: uninstall_filePath: "{{ out.stdout_lines.0 }}"
方法3:用replace过滤器替换所有双引号
如果确定路径中间不会出现双引号,也可以直接全局替换掉所有双引号:
- set_fact: uninstall_filePath: "{{ out.stdout_lines.0 | replace('\"', '') }}"
内容的提问来源于stack exchange,提问作者Samselvaprabu
相关产品推荐
相关产品推荐

