仅出于学习目的。
假设我有一个变量,在此示例中为文本框,我如何一次又一次设置许多属性而又不必一遍又一遍地输入变量名。
我尝试了一些我自己的事情,其中一些工作出于某些奇怪的原因。
这个例子有效。中断用于缩短循环。
$Textbox | % {
$_.Text = "Hello World"
$_.Background = "Black"
$_.Foreground = "Green"
Break
}
Run Code Online (Sandbox Code Playgroud)
这两个示例不起作用,在这里只是为了查看我的尝试。
有和没有“ $ _。”,而不是“。”。我用过“ =”和“ + =”,但都没有用。
$Textbox.@{
Text = "Hello World"
Background = "Black"
Foreground = "Green"
}
$Textbox.({
$_.Text = "Hello World"
$_.Background = "Black"
$_.Foreground = "Green"
})
Run Code Online (Sandbox Code Playgroud)
可能有一种更简单的方法,我在Google上还没有遇到任何问题。
什么你要找的是一个语言结构,如VB [脚本]的With说法,它允许你设置‘目标少’属性引用(如一个隐含的上下文.Text块内)。
有没有在PowerShell中这样的结构。
第一次尝试是PowerShell中最接近的仿真,尽管会牺牲性能(尽管可能无关紧要):在管道中,自动变量$_允许简洁地引用当前的输入对象。
重要提示:请勿break在管道内部使用:它不仅会退出管道,还会退出任何封闭循环,如果没有封闭循环,则会退出封闭脚本。使用return代替。
就是说,在当前情况下,只需要一个输入对象return就不需要了。
至于您的其他尝试:
语法@{...}仅用于哈希表文字。尝试将此语法用作属性名称会导致语法错误。
语法(...)评估包含的任何单个命令/表达式;{...}定义一个脚本块。
这实际上不是一个脚本块执行(这可能需要&在使用时),字符串上下文 -比如一个属性名在这里,评估之间的文字内容{和},即多字符串,显然不不代表的名字的现有属性$TextBox,因此总体结果为$null。
请注意,以适当的严格模式(带有Set-StrictMode -Version 2或更高版本)运行的脚本会将上面的尝试访问不存在的属性标记为错误。
相比之下,尝试分配给不存在的属性总是会产生错误。
但是请注意,PowerShell在构造对象的上下文中提供了方便的多属性初始化,在PowerShell中,您也经常可以通过哈希表初始化程序使用casts来实现。
# Cast a hashtable with property name/value pairs to
# [System.Windows.Forms.TextBox], which implicitly constructs
# an instance with the specified property values:
$TextBox = [System.Windows.Forms.TextBox] @{
Text = "Hello World"
Location = [Point]::new(10, 50)
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,此技术的可用性取决于目标类型是否具有无参数构造函数- 有关详细信息,请参见此答案。