一次设置多个属性 - 相当于VB' s使用语句提供隐含的对象上下文

时间:2017-02-21 21:47:42

标签: powershell syntax

仅供学习。

假设我有一个变量,在本例中是一个文本框,我怎么能一次设置很多属性而不会一遍又一遍地输入变量名。

我尝试过一些自己的东西,其中一个是出于某种奇怪的原因而工作。

此示例有效。 Break用于缩短循环。

 $Textbox | % {
    $_.Text = "Hello World"
    $_.Background = "Black"
    $_.Foreground = "Green"
    Break
 }

这两个例子不起作用,只是为了看看我尝试了什么。

这有和没有" $ _。" s而不是"。"我使用了" ="和" + =",没有一个有用。

 $Textbox.@{
    Text = "Hello World"
    Background = "Black"
    Foreground = "Green"
 }

 $Textbox.({
    $_.Text = "Hello World"
    $_.Background = "Black"
    $_.Foreground = "Green"
 })

可能有一种更简单的方法,我还没有在谷歌上遇到任何事情。

2 个答案:

答案 0 :(得分:3)

您正在寻找的是一种语言结构,例如VB [Script]的With语句,它允许您为“无对象”属性设置隐含的上下文块内的引用(例如.Text)。

PowerShell中没有这样的构造

您的第一次尝试是最接近的模拟在PowerShell中,虽然以牺牲性能为代价(尽管这可能并不重要):管道,自动变量$_允许对手头的输入对象进行简明引用。

重要不要在管道中使用break :它不会退出管道,它会退出任何封闭的循环< / em>,如果没有,则包含封闭脚本改为使用return

那就是说,在目前的情况下,只有单个输入对象,不需要return

至于您的其他尝试

  • 语法@{...}仅用于哈希表文字。尝试将此语法用作属性名称会导致语法错误。

  • 语法(...)计算所包含的任何单个命令/表达式; {...}定义脚本块

    • 字符串上下文中使用时,实际上不执行的脚本块(需要&) - 例如此处的属性名称,评估其{}之间的文字内容,即显然的多行字符串代表一个名称$TextBox的现有属性,因此整体结果为$null

    • 请注意,以适当的严格模式运行的脚本 - Set-StrictMode -Version 2或更高版本 - 会标记上述尝试访问非-existent属性为错误 相反,尝试分配给不存在的属性总是会产生错误。

答案 1 :(得分:0)

如果您为其他目的维护属性的字典(哈希表),您可以编写一个将数据应用于对象的简单函数:

function Set-Properties(
    [parameter(ValueFromPipeline)] $inputObject,
    [hashtable] $properties,
    [switch] $passThru
) {
    process {
        Add-Member -InputObject $inputObject -NotePropertyMembers $properties -force
        if ([bool]$passThru) { $inputObject }
    }
}

用法:

Set-Properties $Textbox @{
    Text = "Hello World"
    Background = "Black"
    Foreground = "Green"
}

$Textbox1, $Textbox2 | Set-Properties -properties @{
    Text = "Hello World"
    Background = "Black"
    Foreground = "Green"
} -passThru | ForEach {
    # do something
}