扩展哈希表中的属性

Expand property in hashtable

提问人:Kenny 提问时间:11/30/2016 最后编辑:Kenny 更新时间:11/30/2016 访问量:3704

问:

我在脚本上遇到了一个简单的问题,我想对远程服务器运行 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 命令正常工作?

数组 PowerShell CSV 哈希表

评论

0赞 iRon 11/30/2016
尝试:ForEach ($Server in $_.Server) {if (GCI \\$Server\c$\log\Completed_Summary_*.html -EA 0 | where {$.LastWriteTime -ge "$ShortDate"}) {Write-Host "FOUND"}}

答:

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“,此代码适用于我的电脑