【问题标题】:Are there any other uses of parenthesis in powershell?powershell中括号还有其他用途吗?
【发布时间】:2026-01-12 18:40:02
【问题描述】:

作为 Powershell 世界的新手,有时我会陷入棘手的语法。这就是为什么我试图找出语言中括号的所有可能用途。

你知道更多吗?可以在这里添加吗?

这是我的(省略了管道中 curly 的基本用法和方法调用中的 round ):

# empty array
$myarray = @()

# empty hash
$myhash = @{}

# empty script block
$myscript = {}

# variables with special characters
${very strange variable @ stack !! overflow ??}="just an example"

# Single statement expressions
(ls -filter $home\bin\*.ps1).length

# Multi-statement expressions inside strings
"Processes: $($p = “a*”; get-process $p )"

# Multi statement array expression
@( ls c:\; ls d:\)

【问题讨论】:

  • 也只有括号 (()) 或(按照您的示例)大括号 ({})?括号([])呢?
  • 是的,大括号和方括号也...对不起我的英语不好。无论如何,大括号不是大括号(或括号)? :)

标签: syntax powershell language-construct


【解决方案1】:

使语句在表达式中产生结果:

($x=3) + 5   # yields 8

【讨论】:

  • 哇。不要以为我永远不会使用它,反正它很棘手!真的无法捕捉到第一句话。不应该是($x=3) + 5
  • 确实,对不起。缺少$。这就是你暂时编写 C# 得到的 :-)
  • 这是奇怪的行为,但它解释了我今天看到的一些奇怪现象。顺便说一句,您的第二种用法只是带有特殊字符的变量。
  • @jasonmarcher - 实际上,他的第二个用法根本与变量无关。它是与 get-content 等效的间接方式,但这也正是它对可变驱动器的工作方式。 $foo 等价于 ${variable:foo}。将“变量:”视为 powershell 中的默认提供程序。
【解决方案2】:

使用泛型时,需要将类型包裹在[..]

New-Object Collections.Generic.LinkedList[string]

对于某些人来说,这可能看起来令人困惑,因为它类似于数组中的索引。

【讨论】:

  • 好吧,但类型总是在[] 中给出,例如用于强制转换/转换。
【解决方案3】:

Param( ) 语句(在函数、脚本或脚本块中)

围绕 If(或 Elseif 语句)中的条件

围绕 switch 语句中的表达式。

编辑:忘记了while语句中的条件。

Edit2:另外,$() 用于子表达式(例如在字符串中)。

【讨论】:

  • 关于 Param、if、switch 和 while,you are true 但它们被恰当地排除在外(foreachfor 也是如此)。你提出的最后一个已经在我的名单上。无论如何感谢您的回答。
  • 子表达式不在列表中。
  • 可能是我遗漏了什么……你指的是不是这个:"Processes: $($p = “a*”; get-process $p ),这确实是一个子表达式,并且在我的列表中。
【解决方案4】:

正则表达式可以说是 Powershell 中的一流构造。

如果我们要编译一个完整的列表,我们可以包括方括号和圆括号在正则表达式中的作用。

一个例子:

$obj.connectionString = $obj.connectionString -replace '(Data Source)=[^;]+', '$1=serverB\SQL2008_R2'

由于对 XML 的支持,您甚至可以将 XPath 中使用的方括号包括在内。 (不过,这确实是一个长弓:-)

select-xml $config -xpath "./configuration/connectionStrings/add[@name='LocalSqlServer']"

【讨论】:

  • 因为正则表达式总是以字符串形式给出,但它们不是 PowerShell 语法的一部分。这也使它们绝对不是一流的构造:-)
  • 是的,我想是的。正则表达式不适合这里。无论如何,谢谢。
  • 我不确定,所以做出有争议的声明是测试定义的好方法。 :-) 这里有更多关于“一流”的定义:*.com/questions/646794/…
【解决方案5】:

在“字符串中的多语句表达式我将添加”之后的第一个短列表中,它甚至写得不够清楚

# Var property inside a string
$a = get-process a*
write-host "Number of process : $a.length" # Get a list of process and then ".length
Number of process : System.Diagnostics.Process (accelerometerST) System.Diagnostics.Process (AEADISRV) System.Diagnostics.Process (agr64svc).length

write-host "Number of process : $($a.length)" # To get correct number of process
Number of process : 3

【讨论】:

    【解决方案6】:

    括号是最有力的。

    假设你想收集一些脚本块的所有输出,包括错误,并重定向到一个变量或另一个函数来处理这个......有了括号,这很容易:

    $customScript = {  "This i as test"; This will be procedure error!  }
    
    (. $customScript 2>&1 ) | %{"CAPTURING SCRIPT OUTPUT: "+$_}
    

    【讨论】: