1 votes

Recommandations sur la façon de lier un groupe de Get- à un fichier .txt de sortie.

Je suis encore en train d'apprendre à me débrouiller avec PS et je cherche quelques recommandations. J'ai travaillé sur script pour trouver si C est < ou = 20GB et lister les endroits habituels comme Documents et Downloads et mesurer leur taille. Maintenant que tout est trié, je veux mettre chaque dossier qu'il vérifie dans un seul output.txt mais je ne sais pas comment. Je pensais d'une certaine manière lier tous mes Get-Childitems ensemble mais je ne sais pas par où commencer. Voici ce que j'ai obtenu jusqu'à présent.

#Check size of C and if its < or = 20GB

$FreeSpace = Get-PSDrive -Name 'c' | Select-Object Free

Write-Host "Free Space On C Left"

$TotalFreeSpace = $FreeSpace.free

$num = $TotalFreeSpace 
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

$condition = $TotalFreeSpace
if ( $condition -le 20 )
{
    Write-Output "The C Drive's free space is > or = 20GB" 
}

#File Location Measures

$UserName = $env:UserName

Write-Host "Desktop Folder Size"

$Desktop = Get-Childitem C:\LOCAL\$UserName\Desktop | Measure-Object -Sum Length

$num = $Desktop.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "My Documents Folder Size"

$Documents = Get-Childitem C:\LOCAL\$UserName\'My Documents' | Measure-Object -Sum Length

$num = $Documents.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "Downloads Folder Size"

$Downloads = Get-Childitem C:\Users\$UserName\Downloads | Measure-Object -Sum Length

$num = $Downloads.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "Picture Folder Size"

$Pictures = Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Pictures' | Measure-Object -Sum Length

$num = $Pictures.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "Music Folder Size"

$Music = Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Music' | Measure-Object -Sum Length

$num = $Music.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "Videos Folder Size"

$Videos = Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Videos' | Measure-Object -Sum Length

$num = $Videos.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

Write-Host "Recycle Bin Size"

($RecycleBin = Get-ChildItem -LiteralPath 'C:\$Recycle.Bin' -File -Force -Recurse -ErrorAction SilentlyContinue |
    Measure-Object -Property Length -Sum).Sum

$num = $RecycleBin.sum
if ($num -lt 1TB) {
    $num = $num / 1GB
    $num = "{0:n2}" -f $num
    "$num GB"
}

 |  Out-File -Path C:\LOCAL\$UserName\Desktop\$UserName'CDriveFullOutput'.txt

#Thanks to Lee_Dailey for Dev help!

2voto

Theo Points 481

La première chose que j'ai remarquée, c'est que vous comptez la taille des fichiers. directement à l'intérieur des dossiers, mais rien de ce qui est stocké dans les sous-dossiers. Vous n'utilisez la récursion que sur la Corbeille..

Deuxièmement, vous répétez le code pour formater la taille à chaque étape, je vous suggère donc de créer une petite fonction d'aide pour cela afin de rendre le code beaucoup plus propre.

Ensuite, vous codez en dur les chemins des dossiers, alors que je pense qu'il existe de meilleures options pour cela. Enfin, si votre objectif est de sortir des nombres formatés en 7 dans un fichier, pourquoi ne pas créer un fichier CSV à partir des informations collectées, afin d'avoir des en-têtes pour vous dire ce que chaque nombre représente.

Essayez ci-dessous :

function Format-ByteSize {
    # helper function to format a given size in bytes
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateRange(0, [double]::MaxValue)]
        [double]$SizeInBytes
    )

    $units = "Bytes", "KB", "MB", "GB", "TB", "PB"
    $index = 0

    while ($SizeInBytes -gt 1024 -and $index -le $units.length) {
        $SizeInBytes /= 1024
        $index++
    }
    if ($index) { '{0:N2} {1}' -f $SizeInBytes, $units[$index] }
    else { "$SizeInBytes Bytes" }
}

#Check size of C and if its < or = 20GB

$FreeSpace = (Get-PSDrive -Name 'C').Free
if ($FreeSpace -le (20 * 1GB)) {
    Write-Warning "The C Drive's free space is less or equal to 20GB" 
}

# get the sizes of the folders of interest. 
$desktopPath = [Environment]::GetFolderPath("Desktop")
$DesktopSize = (Get-Childitem -Path $desktopPath -File -Recurse | Measure-Object -Sum Length).Sum
# seeing that the 'My Pictures', 'My Music' and 'My Videos' folders are INSIDE the 'My Documents' folder, you may
# want to think about adding the -Recurse switch to this path or not..
$DocumentSize = (Get-Childitem -Path ([Environment]::GetFolderPath("MyDocuments")) -File | Measure-Object -Sum Length).Sum
# If you've recursed the 'My Documents' folder, the below sizes will be included there
$PicturesSize = (Get-Childitem -Path ([Environment]::GetFolderPath("MyPictures")) -File -Recurse | Measure-Object -Sum Length).Sum
$MusicSize = (Get-Childitem -Path ([Environment]::GetFolderPath("MyMusic")) -File -Recurse | Measure-Object -Sum Length).Sum
$VideoSize = (Get-Childitem -Path ([Environment]::GetFolderPath("MyVideos")) -File -Recurse | Measure-Object -Sum Length).Sum

# the Downloads folder path is more tricky to find
$downloadsPath = (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
$DownloadSize  = (Get-Childitem -Path $downloadsPath -File -Recurse | Measure-Object -Sum Length).Sum

# finally the recycle bin on the C drive
$RecycleBin = (Get-ChildItem -LiteralPath 'C:\$Recycle.Bin' -File -Force -Recurse -ErrorAction SilentlyContinue |
               Measure-Object -Property Length -Sum).Sum

# now put all this info in an **object** so you can save as CSV file with headers
$result = [PsCustomObject]@{
    FreeSpace   = Format-ByteSize $FreeSpace
    Desktop     = Format-ByteSize $DesktopSize
    MyDocuments = Format-ByteSize $DocumentSize
    MyPictures  = Format-ByteSize $PicturesSize
    MyVideos    = Format-ByteSize $MusicSize
    Downloads   = Format-ByteSize $DownloadSize
    RecycleBin  = Format-ByteSize $RecycleBin
}

# output to console screen
$result

#output to structured CSV file you can open in Excel
$result | Export-Csv -Path (Join-Path -Path $desktopPath -ChildPath 'CDriveFullOutput.csv') -NoTypeInformation -UseCulture

À l'écran, cela donnera quelque chose comme ceci :

FreeSpace   : 119,49 GB
Desktop     : 12,23 KB
MyDocuments : 26,99 MB
MyPictures  : 1,88 GB
MyVideos    : 119,90 GB
Downloads   : 573,88 MB
RecycleBin  : 537 Bytes

0voto

Dominik Points 1

Merci encore les gars, c'est vraiment bien de pouvoir enfin comprendre les tableaux et le fonctionnement de cette aide. Je vais devoir réécrire un tas d'anciennes mesures matérielles lol

function Format-ByteSize {
    # helper function to format a given size in bytes
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateRange(0, [double]::MaxValue)]
        [double]$SizeInBytes
    )

    $units = "Bytes", "KB", "MB", "GB", "TB", "PB"
    $index = 0

    while ($SizeInBytes -gt 1024 -and $index -le $units.length) {
        $SizeInBytes /= 1024
        $index++
    }
    if ($index) { '{0:N2} {1}' -f $SizeInBytes, $units[$index] }
    else { "$SizeInBytes Bytes" }
}

$PCName = $env:computername
$UserName = $env:UserName

$FreeSpace = (Get-PSDrive -Name 'C').Free

if ($FreeSpace -le (20 * 1GB)) {

$Desktop = (Get-Childitem C:\LOCAL\$UserName\Desktop -File -Force -Recurse | Measure-Object -Sum Length).Sum

$Documents = (Get-ChildItem -Path C:\LOCAL\$UserName\'My Documents' -File -Force -Recurse | Measure-Object -Sum Length).Sum

$Downloads = (Get-Childitem C:\Users\$UserName\Downloads -File -Force -Recurse | Measure-Object -Sum Length).Sum

$Pictures = (Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Pictures' -File -Force -Recurse | Measure-Object -Sum Length).Sum

$Music = (Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Music' -File -Force -Recurse | Measure-Object -Sum Length).Sum

$Videos = (Get-Childitem C:\LOCAL\$UserName\'My Documents'\'My Videos' -File -Force -Recurse | Measure-Object -Sum Length).Sum

$RecycleBin = (Get-ChildItem -LiteralPath 'C:\$Recycle.Bin' -File -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -Sum Length).Sum

$Aray = [PsCustomObject]@{

    FreeSpace = Format-ByteSize $FreeSpace
    Desktop = Format-ByteSize $Desktop
    Documents = Format-ByteSize $Documents
    Downloads = Format-ByteSize $Downloads
    Pictures = Format-ByteSize $Pictures
    Music = Format-ByteSize $Music
    Videos = Format-ByteSize $Videos
    RecycleBin = Format-ByteSize $RecycleBin
}

$Aray | Export-Csv -Path (Join-Path -Path "\\HAWA-COL04\Support_Tools\Scripts\PS\Local Scripts\FullC\ScriptOutput" -ChildPath $PCName-$UserName'-FullCDrive'.csv)

}

Merci à Lee_Dailey et Theo pour l'aide de Dev !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X