我一直在 powershell 中与 Exchange Online 统一组和 Microsoft Teams 团队合作:New-UnifiedGroup、Set-UnifiedGroup、Get-UnifiedGroup、New-Team、Get-Team 等。我一直在从 PowerShell 创建组和团队。
我有兴趣更好地理解参数值何时需要引号以及何时不需要。
当我从 CSV 导入时,这些值似乎会自动解释为字符串。当我将它们提供给需要字符串的参数时,该值不需要引号,即使它有空格,例如 New-UnifiedGroup -DisplayName $item.displayName
不需要引号,即使显示名称有空格。
但是,当我想从现有群组创建团队并获取群组 ID 时,群组 ID 需要引号:New-Teams -GroupId "$group.ExternalDirectoryObjectId"
。在这种情况下,参数 -GroupId 需要一个字符串值,尽管它需要的ExternalDirectoryObjectId 不是字符串。
是否存在这样的规则:如果值是字符串,则不需要引号,并且需要字符串值?在将变量传递给需要字符串的参数之前将变量声明为字符串是否有帮助?例如,如果我有一个 $path
变量,我通常必须将其提供为 -Path "$path"
。如果我将路径声明为 [String]$path =
,那么我是否不需要在 -Path $path
最佳答案
通常,仅在 PowerShell 中使用引号来显式传递值作为字符串 (
[string]
)。- 如果字符串文字包含以下任何内容,则需要加引号:空格或更一般的 PowerShell 元字符[1],以及作为较大字符串一部分的命令或表达式字符串(必须括在
$(...)
中 - 见下文)。
- 如果字符串文字包含以下任何内容,则需要加引号:空格或更一般的 PowerShell 元字符[1],以及作为较大字符串一部分的命令或表达式字符串(必须括在
要传递变量的值、其属性之一,甚至是方法调用的结果,您不需要在 PowerShell 中引用,这将传递结果值及其原始数据类型;但是,当该值绑定(bind)到其目标参数时,PowerShell 可能会自动将其转换为参数的类型。
如果目标参数是
[string]
类型(如New-Team
的-GroupId
参数的情况),PowerShell 将自动任何非字符串参数转换为字符串,主要是通过调用.ToString()
上[2]。如果生成的字符串不是正确的表示形式,则必须通过表达式或命令执行显式字符串化。例如,
-GroupId $groupId
和-GroupId $group.ExternalDirectoryObjectId
都可以工作 - 即使结果字符串包含嵌入的空格或其他 PowerShell 元字符。
如果您需要将对象的属性、方法调用或任何类型的命令或表达式作为较大字符串的一部分传递,请将参数括在
"..."
中并使用$(...)
, subexpression operator 围绕表达式/命令(例如"$($group.ExternalDirectoryObjectId)/more"
;在"..."
内部引用变量本身不需要$(...)
)。-
"$group.ExternalDirectoryObjectId"
肯定无法按预期工作,因为只有变量引用$group
本身被识别 - 并字符串化 - 而.ExternalDirectoryObjectId
部分按字面意思处理 em> - 请参阅下面的第一个链接了解原因。
-
进一步阅读:
[1] 元字符是(有些元字符仅在参数的开头时需要引用):
<space> ' " ` , ; ( ) { } | & < > @ #
[2] 确切的字符串化规则(其中还包括文化敏感性因素)在 this answer 中有详细说明。
一般来说,PowerShell 有一个非常灵活的自动类型转换系统,其规则很复杂并且没有明确记录 - peek at the source code 可能会有所帮助。
PowerShell 始终尝试自动将给定值转换为目标类型,其中目标类型可能由参数类型或基于运算符的表达式的(通常)LHS 操作数决定(例如,42 + "1"
产生43
)。
关于string - 传递给参数的值何时需要引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62122213/