【问题标题】:Send slack message with result from Powershell从 Powershell 发送带有结果的松弛消息
【发布时间】:2017-05-13 02:27:07
【问题描述】:

我正在尝试通过 powershell 发送松弛消息,但我被卡住了。这是我的脚本。看起来我不能将 $result 用于 -text。

如果有任何可用磁盘空间低于 15% 或 10%,我要做的是向松弛通道发送警报。

我正在使用 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 ?你没有发出任何东西。

标签: powershell slack-api


【解决方案1】:

您的代码的问题是 $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
    }  
}

说明:

以上代码已将您现有的变量转换为哈希表@{ } 的属性。然后使用此哈希表创建具有New-Object 的对象的属性。

因为 New-Object 自己在一行上,所以它的结果进入管道,最终输出到 $Result,因为这是您发送 ForEach 的结果的地方。

[ordered] 在 Hashtable 前面应该保持属性按照它们定义的顺序。请注意,这需要 PowerShell v3 或更高版本。


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

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

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

【讨论】:

  • 我更新了几次答案。您是否完全按照上面的方式使用我的代码? (包括新对象)。您能否在 gist 或 pastebin 中分享您的完整修改代码。
  • 脚本已更新为您的最新版本。发送到 Slack 后,现在显示为“System.Collections.Specialized.OrderedDictionary”
  • 不要使用 $resulthash,在你的松弛消息中使用 $result。另请参阅我上面关于您可能希望如何首先重新格式化 $result 以用于 slack 的注释。
  • 先这样做:$Result = '' + ($Result | Format-Table | Out-String) + ''
  • 它正在工作!唯一的问题是柱子需要更多的空间,所以它不会变成双线。我可以将列更改为更短的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多