首页 > 解决方案 > 从文本文件加载变量,如果哈希表中存在键,则使用键值

问题描述

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

标签: powershellhashtable

解决方案


因此,您可以创建一个函数,如果字符串包含键名,该函数将返回该键名。它遍历键并检查 $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

推荐阅读