2

我是 PowerShell 脚本的初学者,我希望能够区分脚本的输出。让我们以这个脚本 test.ps1 为例:

param([System.String] $w)
$x=$w+" is correct"
$y=$w+ " is false"
$x
$y

要执行它并检索值 $x 和 $y,我这样做:

$a=.\test1.ps1 -w test
$a[0] #this is x
$a[1] # this is y

有没有办法我们可以使用类似于 $ax 的东西来检索 $x 值?

谢谢。

4

2 回答 2

4

要执行您想要的操作,您将需要一个包含键/值对或命名属性的对象。例如,您可以创建一个a使用属性x和调用的对象y

$x = "one"
$y = "two"
$a = [pscustomobject]@{"x"=$x;"y"=$y}

测试上述案例:

$a

x   y
-   -
one two

$a.x
one
$a.y
two

我喜欢链接PSCustomObjects来解释创建和使用自定义对象。

用函数测试:

function test {

param([string] $w)

$x = $w + "x"
$y = $w + "y"

[pscustomobject]@{"x"=$x; "y"=$y}
}

$a = test "my property "
$a

x             y
-             -
my property x my property y


$a.x
my property x
$a.y
my property y
于 2019-03-04T14:30:21.247 回答
0

AdminOfThings 的有用答案显示了一种提供基于键的值访问的方法,即[pscustomobject].

一般而言,您正在寻找字典哈希表(哈希表):允许通过关联键有效查找值的键值对集合。

实际上,[pscustomobject]链接答案中的技术在语法上基于 PowerShell 的哈希表文字语法@{ <key> = <value>; ... }[1]

为简洁起见,使用脚本块 ( { ... }) 而不是脚本/函数的示例:

$output = & { 
  # Output a hashtable
  @{ x = 'one'; y = 'two' } 
}

# Access the entries by key:

# Index syntax:
$output['x'] # -> 'one'
$output['y'] # -> 'two'

# Dot notation, as with objects, works too.
# While this is convenient, it is much slower with variable-based keys;
# e.g., $output.$keyName - this typically won't matter, but may in loops
# with a high number of iterations.
$output.x # -> 'one'
$output.y # -> 'two'

如果枚举条目的顺序很重要,请使用有序哈希表(PSv3+): [ordered] @{ <key> = <value>; ... }
使用有序哈希表只需支付微不足道的性能损失,因此我建议您养成使用[ordered]习惯,因为它可以提供更好的输出和调试体验,以按照定义条目的顺序查看条目。


在 a[pscustomobject]和哈希表之间进行选择:

  • 如果您将输出设想为具有存储在属性中的值的单个对象,请使用[pscustomobject],但请注意构造对象比构造哈希表要慢。

  • 如果输出只是键值对的集合,请使用(n 有序)哈希表。

如果性能很重要(在具有多次迭代的循环中):

  • 使用(有序)哈希表

  • 对非文字键(例如, )使用索引访问$key = 'one'; $ht[$key],这比非文字点表示法(例如,$key = 'one'; $ht.$key)快得多


[1] 但是请注意,这[pscustomobject] @{ ... }直接构造自定义对象的语法糖——没有创建中间哈希表;此外,由哈希表键定义的属性是按定义顺序定义的,而哈希表保证不对其条目进行特定排序,除非您使用.[ordered] @{ ... }

于 2019-03-04T17:39:09.270 回答