PowerShell如何将参数类型作为参数传递给另一个函数?
如何将参数名作为参数传递给另一个PowerShell函数
要实现不用If语句就把MSIPath或ExePath参数传递给Get-Version,可以用PowerShell的**哈希表+参数展开(Splatting)**技术,具体实现如下:
修正后的Update-Software函数
function Update-Software { # 检查已安装软件与本地文件版本,返回是否需要更新 param ( [Parameter(Mandatory=$True)] [String]$LocalSoftwareSearchString, [Parameter(Mandatory=$True)] [String]$LoadedSoftwarePath, [Parameter(Mandatory=$True)] [ValidateSet("ExePath","MsiPath")] # 限定仅允许传入合法的参数名 [String]$LoadedSoftwareParameterType, [Parameter(Mandatory=$True)] [String]$SoftwareDescription ) # 获取已安装软件版本 $verSWInstalled = Get-Version -SoftwareName $LocalSoftwareSearchString # 构建哈希表,键为参数名,值为对应路径 $versionParams = @{ $LoadedSoftwareParameterType = $LoadedSoftwarePath } # 使用参数展开传递参数给Get-Version $verSWLoaded = Get-Version @versionParams # 版本对比逻辑 if ($verSWInstalled -gt $verSWLoaded) { return $true, "$SoftwareDescription 需要更新" } else { return $false, "$SoftwareDescription 当前已是最新版本" } }
关键说明
- 参数合法性验证:给
LoadedSoftwareParameterType添加[ValidateSet]属性,确保用户只能传入ExePath或MsiPath,避免无效参数名导致的错误。 - 哈希表构建参数:创建哈希表
$versionParams,将传入的参数名作为键,文件路径作为对应值。 - 参数展开(Splatting):用
@$versionParams替代传统的参数传递方式,PowerShell会自动将哈希表中的键值对解析为Get-Version的参数,无需手动写分支判断。
调用示例
针对EXE文件:
Update-Software -LocalSoftwareSearchString Office365 -LoadedSoftwarePath D:\Office.exe -LoadedSoftwareParameterType ExePath
针对MSI文件:
Update-Software -LocalSoftwareSearchString Office365 -LoadedSoftwarePath D:\Office.msi -LoadedSoftwareParameterType MsiPath
补充:修正Get-Version的小问题
原Get-Version函数中存在冗余return语句(如return $null后又return "SOFTWARE NOT FOUND"),后面的return不会执行,建议调整为:
if($null -eq $version){ return "SOFTWARE NOT FOUND" }elseif($version -is [array]){ # 当返回多个版本时是数组类型 return "TOO MANY SOFTWARE VERSIONS FOUND" }else{ [System.Version]$version }
内容的提问来源于stack exchange,提问作者Gene Parmesan
相关产品推荐
相关产品推荐

