PowerShell脚本内预设参数与命令行输入参数合并使用方案
可行解决方案
你当前遇到的参数不生效的核心原因是未给脚本本身声明参数块,命令行传入的-ComputerName无法被脚本内部捕获,具体实现方案如下:
- 首先在脚本最顶部添加脚本级参数声明,强制要求传入
-ComputerName参数 - 把所有站点的固定配置用结构化的哈希表数组存储,后续新增站点只需要更新配置项即可,无需重复写变量
- 根据传入的
ComputerName前缀自动匹配对应站点的固定参数,再调用自定义函数即可
完整可运行代码示例
# 脚本最顶部声明接收命令行传入的参数,必须放在所有逻辑之前 param( [Parameter(Mandatory=$true)] [string]$ComputerName ) function GetInfo { param ($SiteName, $Subnet, $Cred, $ComputerName) # 修正原代码笔误:原示例中写的$Site改为定义的$SiteName变量 Write-Host "Checking $SiteName and $ComputerName" <# 保留你原有检查前缀、子网等逻辑 #> } # 预设所有站点的固定配置,可按需扩展新增站点 $siteConfigs = @( @{ SiteName = "London1" Subnet = "192.168.10.1/24" # 这里替换为你实际的凭据获取方式,也可以提前存储为加密凭据避免每次输入 Cred = Get-Credential -Message "输入London1站点访问凭据" # 配置ComputerName的匹配前缀 MatchPrefix = "Lon1" }, @{ SiteName = "London2" Subnet = "192.168.11.1/24" Cred = Get-Credential -Message "输入London2站点访问凭据" MatchPrefix = "Lon2" } ) # 自动匹配ComputerName对应站点配置 $targetSite = $siteConfigs | Where-Object { $ComputerName -like "$($_.MatchPrefix)*" } | Select-Object -First 1 if (-not $targetSite) { Write-Error "未找到匹配$ComputerName的站点配置,请检查输入" exit 1 } # 调用函数,自动传入站点固定参数+命令行接收的ComputerName GetInfo -SiteName $targetSite.SiteName -Subnet $targetSite.Subnet -Cred $targetSite.Cred -ComputerName $ComputerName
调用说明
直接使用你预期的方式调用即可,不需要传入其余三个固定参数:.\GetPCInf.ps1 -ComputerName "Lon1-PC1".\GetPCInf.ps1 -ComputerName "Lon2-PC1"
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

