【问题标题】:PowerShell : how do I indirectly reference a variablePowerShell:如何间接引用变量
【发布时间】:2022-01-12 12:28:53
【问题描述】:

在 Powershell 中,如何间接引用变量?

我有在代码的许多部分中引用的表,所以我有一个表名列表,如下所示:

$xTableName = "Tbl_x"
$yTableName = "Tbl_y"
$zTableName = "Tbl_z"

我有一个函数,我想将一个表示表格的字符串传递给它:

function getResult($entityName)
{
$tableName="$" + $entityName + "TableName"
$sqlCommand = "SELECT * FROM " + ${$tableName}
run query etc...
}

我打电话

getResult("x")

我正在尝试获取 $sqlCommand = "SELECT * FROM Tbl_x" 但获取的是 "SELECT * FROM $xTableName"

我如何做到这一点?

【问题讨论】:

标签: powershell variables indirection


【解决方案1】:

您可以使用Get-Variable -ValueOnly 按名称获取变量的值:

$tableName = Get-Variable "${entityName}TableName" -ValueOnly

话虽如此,更快且不易出错的方法是利用字典将实体名称映射到表名称:

function getResult($entityName)
{
    $tableMapping = @{
        x = "Tbl_x"
        y = "Tbl_y"
        z = "Tbl_z"
    }
    if(-not $tableMapping.ContainsKey($entityName)){
        Write-Error "Invalid entity name '$entityName'"
    }
    else {
        $tableName = $tableMapping[$entityName]
        $sqlCommand = "SELECT * FROM ${$tableName}"
        # execute sql query ...
    }
}

【讨论】:

  • stackoverflow.com/a/68214332/45375stackoverflow.com/a/53367960/45375stackoverflow.com/q/42783351/45375 对我来说显然是重复的。为什么你认为他们不是?
  • @mklement0 你关闭的欺骗目标没有解释如何使用哈希表而不是Get-Variable
  • (我也认为如果答案已被 OP 接受,那么作为骗子关闭有点奇怪,但这是一个单独的讨论)
  • 关闭重复项与替代解决方案无关。这是关于重复的问题/问题陈述。您的 - 无疑更好 - 替代解决方案(我的 +1)在标记为重复时不会消失 - 并且具有指向重复的链接可以引导未来的读者找到其他答案,这些答案可能具有更适合的其他背景信息/答案他们的特定用例。
  • 而且,不,我不认为用已接受的答案作为重复来结束问题并不奇怪。对我来说,这些方面是完全不相关的:如果一个问题是重复的,它应该被链接到重复的帖子,不管有什么答案(如果有的话),也不管答案是否被接受。
【解决方案2】:

更简洁的方法是使用正则表达式。我们可以这样做:

$xTableName = "Tbl_x"
$yTableName = "Tbl_y"
$zTableName = "Tbl_z"

function getResult($TableName)
{
    $sqlCommand = "SELECT * FROM tableName" -creplace "tableName","$TableName"
}
getResult($xTableName)

【讨论】:

  • 您缺少间接引用变量的方面。此外,如果您在函数内创建字符串,您可以使用简单的字符串连接/插值 - 不需要-creplace$sqlCommand = "SELECT * FROM $TableName"。此外,最好不要重复问题中使用的有问题的语法:getResult($xTableName) 应该是 getResult $xTableName
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-08-11
  • 2014-07-06
相关资源
最近更新 更多