从文本文件加载变量,如果哈希表中存在键,则使用键值
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
我正在尝试创建一个脚本,其中变量在 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