从Powershell发送包含结果的slack消息

从Powershell发送包含结果的slack消息,powershell,slack-api,Powershell,Slack Api,我试图通过powershell发送slack消息,但我被卡住了。这是我的剧本。看起来我无法将$result用于文本 我试图做的是,如果有任何可用磁盘空间低于15%或10%,则向slack channel发送警报 我正在使用Powershell Gallery中的PSSlack $ErrorActionPreference = "Continue"; $percentCritcal = 15; $computers = Get-Content "D:\Disk_Usage\ServerList

我试图通过powershell发送slack消息,但我被卡住了。这是我的剧本。看起来我无法将$result用于文本

我试图做的是,如果有任何可用磁盘空间低于15%或10%,则向slack channel发送警报

我正在使用Powershell Gallery中的PSSlack

$ErrorActionPreference = "Continue"; 
$percentCritcal = 15;

$computers = Get-Content "D:\Disk_Usage\ServerList.txt"
$result = foreach($computer in $computers) 
{ 
    $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
    $computer = $computer.ToUpper() 
    foreach($disk in $disks) 
    {         
        $Size = $disk.Size
        $Freespace = $disk.FreeSpace
        $sizeGB = [Math]::Round($Size / 1073741824, 2)
        $freeSpaceGB = [Math]::Round($Freespace / 1073741824, 2)
        $percentFree = [Math]::Round(($freespace / $size) * 100, 2);

        $ResultHash = [ordered]@{
            Computer = $computer
            Drive = $disk.DeviceID
            SizeGB = $sizeGB
            UsedGB = $sizeGB - $freeSpaceGB
            FreeGB = $freeSpaceGB
            PercFree = $percentFree  
        } 

        New-Object -TypeName PSObject -Property $ResultHash
    }  
}

$Result = $Result | Where-Object {$_.PercFree -lt 10}

if ($Result) 
{
    $token = 'xxxxxxxxxxx'
    $Result = $Result | Format-Table | Out-String

    New-SlackMessageAttachment -Color $_PSSlackColorMap.red `
                               -Title 'Disk Free Space Alert' `
                               -Text $result  `
                               -Fallback 'Bad boy' |

    New-SlackMessage -Channel '#it-test' `
                     -IconEmoji :bomo: `
                     -AsUser `
                     -Username 'BOT' |

    Send-SlackMessage -Token $token  
}
结果是这样的,它重复同一个驱动器几次


有什么想法吗?

你的代码的问题是,
$Result
从来没有填充过任何内容。最简单的修复方法是在ForEach循环中创建一个对象,然后填充$Result

例如:

$result = foreach($computer in $computers) 
{ 
    $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
    $computer = $computer.ToUpper() 
    foreach($disk in $disks) 
    {         
        $Size = $disk.Size
        $Freespace = $disk.FreeSpace
        $sizeGB = [Math]::Round($Size / 1073741824, 2)
        $freeSpaceGB = [Math]::Round($Freespace / 1073741824, 2)

        $ResultHash = [ordered]@{
            Computer = $computer
            deviceID = $disk.DeviceID
            volName = $disk.VolumeName 
            percentFree = [Math]::Round(($Freespace / $Size) * 100, 2) 
            sizeGB = $sizeGB
            freeSpaceGB = $freeSpaceGB
            usedSpaceGB = $sizeGB - $freeSpaceGB
        }

        New-Object -TypeName PSObject -Property $ResultHash
    }  
}
说明:

上面的代码获取了现有变量,并将它们转换为哈希表的属性
@{}
。然后使用此哈希表创建具有
新对象的对象的属性

因为新对象本身在一行上,所以它的结果进入管道,最终输出到$result,因为在那里可以发送
ForEach
的结果

哈希表前面的
[ordered]
应按定义的顺序保留属性。请注意,这需要PowerShell v3或更高版本


根据您希望它的外观,您可能还希望在
ForEach
之后和在Slack消息中使用它之前对$Result执行此操作:

$Result = '```' + ($Result | Format-Table | Out-String) + '```'

这将使消息以表格格式格式化为固定宽度代码。当然,您可能希望以不同的方式修改输出,这只是一个建议。

代码的问题是,
$Result
从未填充任何内容。最简单的修复方法是在ForEach循环中创建一个对象,然后填充$Result

例如:

$result = foreach($computer in $computers) 
{ 
    $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
    $computer = $computer.ToUpper() 
    foreach($disk in $disks) 
    {         
        $Size = $disk.Size
        $Freespace = $disk.FreeSpace
        $sizeGB = [Math]::Round($Size / 1073741824, 2)
        $freeSpaceGB = [Math]::Round($Freespace / 1073741824, 2)

        $ResultHash = [ordered]@{
            Computer = $computer
            deviceID = $disk.DeviceID
            volName = $disk.VolumeName 
            percentFree = [Math]::Round(($Freespace / $Size) * 100, 2) 
            sizeGB = $sizeGB
            freeSpaceGB = $freeSpaceGB
            usedSpaceGB = $sizeGB - $freeSpaceGB
        }

        New-Object -TypeName PSObject -Property $ResultHash
    }  
}
说明:

上面的代码获取了现有变量,并将它们转换为哈希表的属性
@{}
。然后使用此哈希表创建具有
新对象的对象的属性

因为新对象本身在一行上,所以它的结果进入管道,最终输出到$result,因为在那里可以发送
ForEach
的结果

哈希表前面的
[ordered]
应按定义的顺序保留属性。请注意,这需要PowerShell v3或更高版本


根据您希望它的外观,您可能还希望在
ForEach
之后和在Slack消息中使用它之前对$Result执行此操作:

$Result = '```' + ($Result | Format-Table | Out-String) + '```'

这将使消息以表格格式格式化为固定宽度代码。当然,您可能希望以不同的方式修改输出,这只是一个建议。

什么是$result?你没有发射任何东西。结果如何?你没有发出任何信息。我更新了几次答案。您是否完全按照上面的方式使用我的代码?(包括新对象)。你能在gist或pastebin中分享你全部修改过的代码吗?脚本更新为你的最新版本。发送到Slack后,现在显示为“System.Collections.Specialized.OrderedDictionary”不要使用$ResultAsh,在Slack消息中使用$result。另外,请参阅我上面的说明,了解您可能希望如何首先为slack重新格式化$result。请首先执行此操作:$result='
'+($result | Format Table | Out String)+'
'它正在工作!!!唯一的问题是柱子需要更多的空间,所以它不会变成双线。我可以将列更改为较短的名称。我更新了几次答案。您是否完全按照上面的方式使用我的代码?(包括新对象)。你能在gist或pastebin中分享你全部修改过的代码吗?脚本更新为你的最新版本。发送到Slack后,现在显示为“System.Collections.Specialized.OrderedDictionary”不要使用$ResultAsh,在Slack消息中使用$result。另外,请参阅我上面的说明,了解您可能希望如何首先为slack重新格式化$result。请首先执行此操作:$result='
'+($result | Format Table | Out String)+'
'它正在工作!!!唯一的问题是柱子需要更多的空间,所以它不会变成双线。我可以将列更改为较短的名称