从文本文件加载变量,如果哈希表中存在键,则使用键值

Load Variables from text file and if key exists in hashtable, use key value

我正在尝试创建一个脚本,其中变量在 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"

脚本内容。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 以查看它是否包含键文本 else returns 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