我是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值?
谢谢。
答案 0 :(得分: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
答案 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] @{ ... }
。