NSIS中nsExec::ExecToStack输出处理是否正确?逻辑判断异常求助
NSIS判断MSMQ状态失效问题解决
问题原因
虽然日志打印显示MSMQ is: Installed,但nsExec::ExecToStack获取的PowerShell输出实际包含隐藏的换行符(PowerShell默认输出会追加换行),导致$InstallState变量的实际值是Installed\r\n或Installed\n,而NSIS的字符串比较是严格匹配的,因此$InstallState == "Installed"的判断会失败,执行else分支。
解决方案
方案1:修改PowerShell命令,输出无空白的结果
直接让PowerShell返回不带换行、无多余空白的字符串,两种写法可选:
- 使用
Trim()清除前后空白,并用Write-Host -NoNewline避免追加换行:
nsExec::ExecToStack 'powershell.exe -command "(get-windowsfeature -name MSMQ-Services).InstallState.Trim() | Write-Host -NoNewline"'
- 或者直接通过PowerShell的输出处理去掉换行:
nsExec::ExecToStack 'powershell.exe -command "$((get-windowsfeature -name MSMQ-Services).InstallState).Trim()"'
方案2:在NSIS中处理变量,清除空白字符
如果不想修改PowerShell命令,可在NSIS中对$InstallState做清洗,去掉换行、空格等空白字符:
!include "StrFunc.nsh" ${StrTrim} $InstallState "$InstallState" " \t\r\n" ; 清除前后所有空白字符
或者手动截断最后一个换行字符(适合确定只有一个换行的情况):
StrCpy $InstallState "$InstallState" "" -1 ; 移除变量最后一个字符
修改后的完整代码示例
DetailPrint "======================" DetailPrint "Checking MSMQ Services" DetailPrint "======================" ; 优化PowerShell命令,确保输出无多余空白和换行 nsExec::ExecToStack 'powershell.exe -command "(get-windowsfeature -name MSMQ-Services).InstallState.Trim() | Write-Host -NoNewline"' Pop $0 Pop $InstallState ; 打印带引号的变量,方便排查是否有隐藏空白 DetailPrint "MSMQ is: '$InstallState'" ${If} $InstallState == "Installed" DetailPrint "MSMQ is Installed" ${Else} DetailPrint "========================" DetailPrint "Installing MSMQ Services" DetailPrint "========================" nsexec::exectolog 'powershell -command "install-windowsfeature -name msmq-services"' ${EndIf}
验证技巧
可以通过打印变量长度来确认是否存在隐藏字符:
StrLen $1 $InstallState DetailPrint "InstallState length: $1"
正常情况下,"Installed"的长度是8,如果长度大于8,说明存在额外字符。
内容的提问来源于stack exchange,提问作者tcweb
相关产品推荐
相关产品推荐

