【问题标题】:Powershell: Passing string that contains variables to functionPowershell:将包含变量的字符串传递给函数
【发布时间】:2020-11-10 12:54:49
【问题描述】:

我有一个用于与 Microsoft GraphAPI 交互的脚本。在脚本中,我为要使用的 URL 定义了一个变量,例如

$UriGet = "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies?`$filter=startswith(displayName,`'$Identifier`')" 

然后该函数从 CSV 读取数据,并根据 $UriGet URI 处理 CSV 中的每一行。函数调用如下:

Invoke-GraphApi -UriGet $UriGet

但是,在函数内部,实际的 "$Identifier" 变量被替换为任何内容,例如就像 $UriGet 已通过评估函数前变量传递,此时它的 $null。

例如,在“Invoke-GraphApi 函数中,写入主机 $UriGet 提供

URIGet value:  "https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies?$filter=startswith(displayName,'')"

所以问题是,如何将完整的字符串传递给函数而不计算变量?


编辑 - 这是函数的参数块

    Param (

        [parameter(Mandatory=$true)]
        [Hashtable]$MsGraphAuthenticationHeader,

        [parameter(Mandatory=$true)]
        [String]$UriGet,

        [parameter(Mandatory=$true)]
        [String]$UriPatch,

        [parameter(Mandatory=$true)]
        [String]$UriPost,

        [parameter(Mandatory=$true)]
        [String]$Identifier,

        [parameter(Mandatory=$true)]
        [String]$RequestBody
    )

【问题讨论】:

  • 请告诉我们Invoke-GraphApi函数定义(或者,至少,它的param()块)
  • @MathiasR.Jessen 我已将参数块添加到原始帖子中。

标签: powershell


【解决方案1】:

字符串开头和结尾的单引号将防止变量扩展。字符串中的引号不会影响变量是否被其值替换。

PS > $a="string"
PS > write-host "some $a"
some string
PS > write-host 'some $a'
some $a

如果在结果字符串中需要相同类型的引号,则需要将这些引号加倍。它不影响字符串是否被其值替换。

PS > write-host "some ""$a"" in quotes"
some "string" in quotes
PS > write-host 'some ''$a'' in quotes'
some '$a'

如果您需要在结果字符串中包含不同类型的引号,只需按原样编写即可。同样,它不会影响其值的变量替换。

PS > write-host "some '$a' in quotes"
some 'string' in quotes
PS > write-host 'some "$a"'
some "$a"

【讨论】:

  • 谢谢,是的,我明白这一点,但是我传入的字符串已经转义了 ' 字符,所以我认为还有更多:)
  • 您好,您声明的字符串 以双引号开始和结束,因此无论内部单引号如何,它都在进行变量替换。如果您还需要在已经单引号的字符串中添加单引号,则需要使用“双单引号”。我已经用这些额外的解释和示例更新了我的答案。
【解决方案2】:

在您不想评估的每个变量之前插入一个反引号 ` 。请参阅下面的 Microsoft 文档“关于引用规则”,特别是本节:

“要防止在双引号字符串中替换变量值,请使用反引号字符 (`)(ASCII 96),它是 PowerShell 转义字符”

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules

【讨论】:

    【解决方案3】:

    感谢大家的输入 :) 我最终使用了 @igor 的简化引用规则。由于查询字符串中需要' 字符,它仍然无法正常工作。所以我随后使用-replace 功能根据下面的代码块替换实际的搜索字符串。

    $UriGet = 'https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies?$filter=startswith(displayName,#___PolicyName___#)'
    
    $UriGet = $UriGet -replace '#___PolicyName___#', $Identifier
    

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2018-05-05
      • 2016-01-17
      相关资源
      最近更新 更多