PowerShell Foreach循环中If语句语法问题求助
PowerShell循环设置注册表值问题解决
问题分析
你当前代码存在三个核心问题:
- 初始代码硬写了
server1,未使用循环变量$item,导致无论哪个服务器连通,都会设置成固定地址 - 第二个代码的
if判断逻辑错误,误将循环变量$_与字符串'True'比较,实际应判断端口测试结果$Result;同时代码未闭合},存在语法缺失 - 第三个代码的字符串拼接错误,单引号包裹的
$_不会被PowerShell解析为变量,无法替换成当前服务器名
修正后的完整代码
$list = @("server1", "server2", "server3") # 服务器列表 foreach ($item in $list) { # 测试当前服务器的1234端口连通性 $result = Test-NetConnection $item -Port 1234 | Select-Object -ExpandProperty TcpTestSucceeded if ($result) { # 拼接对应服务器的地址,设置注册表值 $targetUrl = "http://$item`:1234/bfmirror/downloads/" Set-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Client\__site1 -Name Value -Value $targetUrl # 可选:输出日志确认操作 Write-Host "已将注册表值设置为:$targetUrl" # 如果找到第一个连通的服务器就停止循环,取消下面的注释 # break } }
关键修正点说明
- 变量替换正确写法:使用双引号包裹字符串,变量
$item会被自动解析;注意端口号前的冒号需要加反引号`转义,避免被PowerShell当成变量的一部分 - 条件判断简化:PowerShell中布尔值
$true可以直接用if ($result)判断,无需写-eq $true - 代码完整性:确保所有代码块的
{}都正确闭合,避免语法错误
如果希望找到第一个连通的服务器就停止循环,取消代码中break的注释即可。
内容的提问来源于stack exchange,提问作者Alvin Loo
相关产品推荐
相关产品推荐

