通过符号名称(键)从脚本访问多个输出

时间:2019-03-04 14:22:32

标签: powershell hashtable key-value pscustomobject

我是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

有没有一种方法可以使用类似于$ a.x的方式来检索$ x值?

谢谢。

2 个答案:

答案 0 :(得分:4)

要执行所需的操作,您将需要一个包含键/值对或命名属性的对象。例如,您可以创建一个名为a的对象,其属性为xy

$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

答案 1 :(得分:0)

AdminOfThings' helpful answer显示了一种提供基于键的值访问的方法, [pscustomobject]

一般而言,您要查找 字典哈希表 (哈希表):一组键值对,允许通过其关联的键高效查找值。

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

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

$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],因为这样可以提供更好的输出和调试体验,使它们按与它们相同的顺序查看条目定义。


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

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

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

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

  • 使用(排序的)哈希表

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


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