仅供学习。
假设我有一个变量,在本例中是一个文本框,我怎么能一次设置很多属性而不会一遍又一遍地输入变量名。
我尝试过一些自己的东西,其中一个是出于某种奇怪的原因而工作。
此示例有效。 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"
})
可能有一种更简单的方法,我还没有在谷歌上遇到任何事情。
答案 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
}