powershell - 从文本文件加载变量,如果哈希表中存在键,则使用键值
问题描述
我正在尝试创建一个脚本,其中变量位于 PowerShell 脚本之外。它只是一个文本文件。在该文件中,我们定义服务器名称、组名称及其值。组名意味着主机在其主机名中包含这些字符串。
主机名的优先级较高,组名的优先级最低。如果两者都不存在,则有一个默认值(在 ps 脚本内)。
以下elseif
条件对我不起作用,我尝试了很多其他方法但无法使其正常工作。
elseif ($MachineName.Contains("$var.key")) { # Doesn't work. What can be used here?
$foldername = ("$var.value") # Doesn't work. What can be used here?
}
内容vars.txt
:
#Groups
DB=folder7
#Hostnames
server_JIRA_001=folder3
server_DB_001=folder5
server_DB_005=folder6
如果主机名是 server_DB_006,它将使用值“folder7”,因为它的主机名中有“DB”,但如果主机名是 server_DB_005,那么它将使用值“folder6”
script.ps1 的内容
$MachineName = "server_DB_006"
$var = (Get-Content "c:\Users\user\Desktop\vars.txt" -Raw | ConvertFrom-StringData)
if ($var.$MachineName -ne $null) {
# if hostname exists, then use its var.value
$foldername = ($var.$MachineName) # returns value of $var.hostname
} elseif ($MachineName.Contains("$var.key")) { # Doesn't work. What can be used here?
# if no hostname defined, then search for group name and use its var.value
$foldername = ("$var.value") # Doesn't work. What can be used here?
} else {
foldername = "default_folder"
}
解决方案
因此,您可以创建一个函数,如果字符串包含键名,该函数将返回该键名。它遍历键并检查 $Text 以查看它是否包含键文本,否则返回 false。
function StringContainsHashTableKey(){
PARAM(
[string]$Text,
[hashtable]$HashTable
)
foreach($i in $Hashtable.Keys.GetEnumerator()){
if($Text -like "*$i*" ){
return $i
}
}
return $false
}
$Var = Get-Content "c:\Users\user\Desktop\vars.txt" -Raw | ConvertFrom-StringData
$MachineName = "server_DB_006"
$KeyMatch = StringContainsHashTableKey -Text $MachineName -HashTable $Var
if ($var.$MachineName -ne $null) { #if hostname exists, then use its var.value
$foldername = ($var.$MachineName) # returns value of $var.hostname
}
# If no hostname defined, then search for group name and use its var.value
Elseif ($KeyMatch -ne $false) { # Doesn't work. What can be used here?
$foldername = $var.$KeyMatch
}
Else {
$foldername = "default_folder"
}
$foldername
推荐阅读
- excel - 将同一列中的单元格值与 Excel 中的其他条件进行比较
- android - 找到多个文件,其独立于操作系统的路径 'META-INF/androidx.legacy_legacy-support-core-utils.version' (java)
- html - 在一行CSS中放置一个带圆圈的矩形
- vue.js - Vuex mapActions:映射器参数必须是数组或对象
- angular - ASP.NET Core + Angular 使用 Azure DevOps 发布管道部署工件
- gulp - 错误:src 路径的 glob 参数无效,用作变量
- haskell - 为什么 Monoidal 和 Applicative 定律告诉我们同样的事情?
- java - 如何在不同时区的某个时间执行作业
- mysql - 坚持基于三个表获取行
- codec - LibAOM软件部分功能中的“facade”是什么意思