Créer une Table avec des Variables en PowerShell
Je suis encore à apprendre mon chemin autour de scripts PowerShell et je travaille sur un script pour calculer le pourcentage d'espace libre de mes serveurs de fichier et l'envoyer un e-mail de notification quand un disque atteint 10% d'espace libre restant ou moins (ce qui arrive environ une fois par mois, et j'ai besoin de savoir avant que je reçois par e-mail à partir du client qu'il n'y a pas de plus d'espace). À compter de maintenant, le script fonctionne très bien et est configuré pour exécuter chaque matin, via des Tâches de Windows. Mais la mise en forme actuelle que j'ai en place pour la sortie se fait manuellement. Je me demandais si il y avait moyen de passer les variables à partir des renseignements qui ont été recueillis et sont calculées avec la Get-WmiObject fonction. J'ai essayé le Format-Table et tenté de jouer avec les tables de hachage, mais en vain. Toutes les idées seraient utiles. Merci.
# Set Parameters
$file = "c:\location\Lowdisk.txt"
Clear-Content $file
$emailTO = "[email protected]"
$emailFrom = "[email protected]"
$smtpServer = "smtpServer"
$diskspace = "3"
$computers = ("FSCN01","FSCN02","FSCN03","FSCN04")
echo "Server Name Drive Drive Size Free Space % Free" >> $file
$i = 0
# Get Drive Data
foreach($computer in $computers)
{
$drives = Get-WmiObject -ComputerName $computer Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}
foreach($drive in $drives)
{
$ID = $drive.DeviceID
$size1 = $drive.size / 1GB
$size = "{0:N1}" -f $size1
$free1 = $drive.freespace / 1GB
$free = "{0:N1}" -f $free1
$a = $free1 / $size1 * 100
$b = "{0:N1}" -f $a
# Monitor for drive free space % under 10%
if ($b -lt 10)
{
echo "$computer $ID $size $free $b" >> $file
$i++
}
}
}
# Send notification if script finds more than 0 drives with less than 35% free space
if ($i -gt 0)
{
foreach ($user in $emailTo)
{
echo "Sending Email Notification to $user"
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$subject = "Server with Low Disk Space"
foreach ($line in Get-Content $file)
{
$body += "$line `n"
}
Send-MailMessage -to $user -From $emailFrom -Attachments $file -SmtpServer $smtpServer -Subject $Subject -Body $body
$body = ""
}
}
OriginalL'auteur user3140412 | 2014-02-17
Vous devez vous connecter pour publier un commentaire.
Format-Table
fonctionne mieux lorsque vous avez toutes les données de l'intérêt dans un seul type d'objet. Je recommande la création d'objets personnalisés pour cela par exemple:Si vous souhaitez modifier le format d'affichage puis dans la commande format-table, vous pouvez faire ceci:
Merci beaucoup, il a été très utile!
OriginalL'auteur Keith Hill
Keith a ce qu'il faut, mais comme ma réponse était à moitié écrite de toute façon, elle est ici. Ma version ne nécessite aucune nouvelle de créer des objets et a de filtrage dans le cadre de la canalisation.
Que Keith dit, de tout garder comme un objet jusqu'à la dernière minute. Si vous avez besoin de force PowerShell pour le format, l'utilisation de "hors-chaîne'.
Aussi, chercher de l'aide pour les listes. De nombreuses commandes de prendre une liste comme un paramètre (par exemple, liste de noms d'ordinateur, les destinataires de courrier électronique), sans la nécessité pour les boucles for-each. Cela peut rendre le code plus concis, mais sans doute moins lisible, surtout pour un débutant. De toute façon, voici ce que j'ai concocté:
OriginalL'auteur andyb