如何用PowerShell从.conf文件读取布尔值?脚本故障求助
WSL关联程序关闭工具的问题排查与修复
问题背景
开发了一款用于关闭WSL及Windows Terminal等关联程序的小工具,期望通过.conf文件中的TRUE/FALSE配置控制是否关闭Windows Terminal,但添加判断逻辑后程序无法正常执行该功能。
错误原因分析
布尔值类型不匹配
配置文件中WINTERMINAL=$true被读取为字符串"$true",而非PowerShell原生布尔值$true。直接将字符串与布尔值$true比较,结果始终为$false,导致关闭Windows Terminal的代码块永远不会触发。进程名变量未定义
代码中Get-Process $windowsterminal引用的$windowsterminal是未定义的变量,配置文件也未对应设置该键名。Windows Terminal的实际进程名为WindowsTerminal,此处变量引用错误导致无法正确获取进程。配置解析逻辑不严谨
原代码使用Split("=")分割配置项,若值中包含=会出现解析错误;同时未对布尔类型的配置值做类型转换,导致变量始终为字符串类型。
修复方案
1. 修正配置文件的布尔值写法
将.conf中的布尔值去掉$,改为纯文本的true/false:
DISTRO=ubuntu2004 EDITOR=code WINTERMINAL=true
2. 优化配置解析逻辑
使用正则匹配解析配置,并自动转换布尔值类型:
foreach ($line in Get-Content stop.conf) { if ($line -match '^\s*([^=]+)\s*=\s*(.+)\s*$') { $varName = $matches[1] $varValue = $matches[2] # 转换布尔值 if ($varValue -in 'true', 'false') { Set-Variable -Name $varName -Value ([bool]$varValue) } else { Set-Variable -Name $varName -Value $varValue } } }
3. 修正Windows Terminal进程名
直接使用正确的进程名WindowsTerminal获取进程:
$windowsTerminal = Get-Process WindowsTerminal -ErrorAction SilentlyContinue
4. 简化布尔值判断逻辑
直接使用变量本身作为判断条件,避免类型比较问题:
if ($WINTERMINAL) { # 关闭Windows Terminal的逻辑 }
修复后的完整代码
# 读取配置文件并解析变量 foreach ($line in Get-Content stop.conf) { if ($line -match '^\s*([^=]+)\s*=\s*(.+)\s*$') { $varName = $matches[1] $varValue = $matches[2] # 处理布尔值转换 if ($varValue -in 'true', 'false') { Set-Variable -Name $varName -Value ([bool]$varValue) } else { Set-Variable -Name $varName -Value $varValue } } } # 检查并保存运行中的进程 $IDE = Get-Process $EDITOR -ErrorAction SilentlyContinue $windowsTerminal = Get-Process WindowsTerminal -ErrorAction SilentlyContinue $linuxsys = Get-Process $DISTRO -ErrorAction SilentlyContinue # 根据配置关闭Windows Terminal if ($WINTERMINAL) { if ($windowsTerminal) { # 先尝试优雅关闭 $windowsTerminal.CloseMainWindow() Start-Sleep -Seconds 5 if (!$windowsTerminal.HasExited) { $windowsTerminal | Stop-Process -Force } } }
内容的提问来源于stack exchange,提问作者Flamiing
相关产品推荐
相关产品推荐

