提问人:Kenny 提问时间:11/30/2016 最后编辑:Kenny 更新时间:11/30/2016 访问量:3704
扩展哈希表中的属性
Expand property in hashtable
问:
我在脚本上遇到了一个简单的问题,我想对远程服务器运行 GCI,问题是该值与另一个哈希表属性组合在一起,因此 GCI 失败。
该脚本从两列 .csv 中读取条目,标头为“服务器”和“平台”
这是我得到的:
$ShortDate = (Get-Date).ToString('MM/dd/yyyy')
$CheckServer = @{}
$serverObjects = @() # create a list of server objects
Import-Csv $Dir\Servers.csv | ForEach {
$CheckServer.Server = $_.Server
$CheckServer.Platform = $_.Platform
if (GCI \\$_.Server\c$\log\Completed_Summary_*.html -EA 0 | where {$.LastWriteTime -ge "$ShortDate"}) {
Write-Host "FOUND"
} # end of IF GCI
} # end of For-Each
$serverObjects += New-Object -TypeName PSObject -Property $CheckServer
问题是 的条目应该是 SERVER1、SERVER2、SERVER3 等,服务器中的所有条目.csv而是将两者的值合并在一起。如:$_.Server
$_.Server
$_.Platform
Write-Host "Checking" \\@{Server=SERVER1; Platform=PLATFORM_1}.Server\c$\log\Completed_Summary_*.html
它应显示如下:
Write-Host "Checking" \\SERVER1\log\Completed_Summary_*.html
如何取消合并它们以使 GCI 命令正常工作?
答:
6赞
Ansgar Wiechers
11/30/2016
#1
PowerShell 仅在字符串中执行简单的变量扩展。对于更复杂的表达式,如索引操作或访问对象属性/方法,它将插入数组或对象变量的字符串化值,而操作的其余部分保持不变。
示范:
PS C:\> $array = 23, 42 PS C:\> Write-Host "some $array[1] or other" some 23 42[1] or other PS C:\> $object = New-Object -Type PSObject -Property @{Foo=23; Bar=42} PS C:\> Write-Host "some $object.Foo or other" some @{Bar=42; Foo=23}.Foo or other
为避免这种情况,您需要:
首先将结果值分配给变量,并在字符串中使用该变量:
$value = $array[5] Write-Host "some $value or other" $value = $object.Foo Write-Host "some $value or other"
使用子表达式 ():
$(...)
Write-Host "some $($array[5]) or other" Write-Host "some $($object.Foo) or other"
使用格式运算符 ():
-f
Write-Host "some {0} or other" -f $array[5] Write-Host "some {0} or other" -f $object.Foo
评论
0赞
Kenny
11/30/2016
我将如何使上述内容与我现有的脚本一起工作?我尝试了write-host“检查$($CheckServer[1])”和write-host“检查$($ServerObjects[1])”..两者都没有产生结果。
0赞
Ansgar Wiechers
11/30/2016
$CheckServer
是一个哈希表,而不是一个数组,只是一个空数组,因为你的代码永远不会填充它。这就是为什么你的两次尝试都不起作用。使用问题中的代码,您只需更改为 .但是,从您在问题中发布的内容来看,这不是您的实际(或至少不是完整的)代码。$ServerObjects
\\$_.Server\c$\log\Completed_Summary_*.html
"\\$($_.Server)\c$\log\Completed_Summary_*.html"
0赞
Kenny
11/30/2016
没错,这是一个哈希表,我添加了缺少的脚本的最后一行,其中收集了所有$ServerObjects。
0赞
Ansgar Wiechers
11/30/2016
你的代码没有多大意义。您正在循环中修改哈希表,然后将从哈希表创建的自定义对象附加到循环后的数组中。这将只将一个包含上次迭代数据的对象放入数组中。你的代码最终想要实现什么?
0赞
Kenny
11/30/2016
它来自我已经使用了大约一年的模板,它适用于我使用它的所有其他示例函数,但是,PowerShell 总是有改进的余地:-)我愿意根据您提供的方法重写它。我使用的模板的想法是在运行不同的测试时将元素添加到哈希表/数组中。最后将它们全部收集到.csv/网格视图或通过电子邮件发送。
0赞
Esperento57
11/30/2016
#2
像它一样修改
$ShortDate = Get-Date -Hour 0 -Minute 0 -Second 0
$CheckServer = @{}
$serverObjects = @() # create a list of server objects
$Dir="C:\temp"
Import-Csv $Dir\Servers.csv | ForEach {
$CheckServer.Server = $_.Server
$CheckServer.Platform = $_.Platform
if (GCI "\\$($_.Server)\c$\log\Completed_Summary_*.html" -EA 0 | where {$_.LastWriteTime -ge $ShortDate})
{
Write-Host "FOUND"
}
}
评论
0赞
Kenny
11/30/2016
谢谢,我试过了,但我没有用。我得到“术语'$。LastWriteTime'“一遍又一遍。
0赞
Esperento57
11/30/2016
但我被纠正了 $_。LastWriteTime“,此代码适用于我的电脑
评论
ForEach ($Server in $_.Server) {if (GCI \\$Server\c$\log\Completed_Summary_*.html -EA 0 | where {$.LastWriteTime -ge "$ShortDate"}) {Write-Host "FOUND"}}