PowerShell:尝试获取桌面和文档文件夹大小

时间:2017-05-10 21:04:06

标签: powershell

嘿,我们被要求从我的环境中的所有工作站中找出用户在桌面和文档文件夹中使用了多少空间。我认为PowerShell应该能够告诉我这些信息,并且我有一个脚本,有点像我做它想要它,但它不够健壮。这就是我想出的:

# This collects the user running the script's Documents folder size.
$DocumentsSize = (Get-ChildItem $env:USERPROFILE\Documents -recurse | Measure-Object -property length -sum)

# This collects the user running the script's Desktop folder size.
$DesktopSize = (Get-ChildItem $env:USERPROFILE\Desktop -recurse | Measure-Object -property length -sum)

# This converts the Documents folder size to GB with 1 decimal place and outputs the result.
$DocumentOutput = "Documents {0:N1}" -f ($DocumentsSize.sum / 1GB) + " GB"

# This converts the Desktop folder size to GB with 1 decimal place and outputs the result.
$DesktopOutput = "Desktop {0:N1}" -f ($DesktopSize.sum / 1GB) + " GB"

# This writes the output of the Documents folder size calculation to a file in the current user's Documents folder as their username.txt
$DocumentOutput | Out-File $env:USERPROFILE\Documents\$env:USERNAME.txt -Append

# This writes the output of the Desktop folder size calculation to a file in the current user's Documents folder as their username.txt
$DesktopOutput | Out-File $env:USERPROFILE\Documents\$env:USERNAME.txt -Append

对于输出到Documents文件夹中的文件的单个用户来说,这一切都很好。我需要做的是从域控制器运行它,这样它将解析我所拥有的CSV文件中的每个工作站,标题为" HostName"并将结果输出到新的CSV文件,以便我们获取桌面和文档文件夹各占用的空间量,并包含与这些值关联的用户名。

我越深入研究这个问题,我就越发现两件事情:1)这个请求超出了我微薄的PowerShell脚本技能,2)需要一些更高级的命令。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

您可以在指定计算机上找到所有用户,其中包含C:\ Users文件夹的列表内容。然后只需为每个步骤重复步骤。

foreach ($Comp in (Get-Content 'hosts.txt')) {
    foreach ($UserFolder in (Get-ChildItem "\\$Comp\c$\Users" -Directory)) {

        $DocumentsFolder = Join-Path ($UserFolder.FullName) 'Documents'
        $DesktopFolder = Join-Path ($UserFolder.FullName) 'Desktop'

        $DocumentsSize = (Get-ChildItem $DocumentsFolder -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue)
        $DesktopSize = (Get-ChildItem $DesktopFolder -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue)

        $DocumentOutput = "Documents {0:N1}" -f ($DocumentsSize.sum / 1GB) + " GB"
        $DesktopOutput = "Desktop {0:N1}" -f ($DesktopSize.sum / 1GB) + " GB"

        $FileName = Join-Path $DocumentsFolder (($UserFolder.Name)+'.txt') 
        $DocumentOutput | Out-File $FileName -Append
        $DesktopOutput | Out-File $FileName -Append

    }
}

这里有几个问题:

  • 始终附加输出,因此最好在每次运行时删除文件,或者在文件中添加一些时间戳。如果您想将其存储在其他/中心位置,只需使用$ FileName
  • 即可
  • 如果要覆盖所有案例,可能需要使用用户根文件夹。不是每台机器都是C:\ Users。 Google for Get-WmiObject -Class Win32_UserProfile

答案 1 :(得分:0)

这是我正在使用的最终代码。生成的文件是一个平面文本文件,我可以将其作为空格分隔文件导入电子表格,并且效果很好。

recipiesList.map(s => Recipe(s(0), s(1))

答案 2 :(得分:0)

我知道这是一篇旧帖子,但我想感谢@Kamikaze Duck 让我开始并发布我刚刚创建的修订/改进的代码。此代码将在您运行脚本的目录中输出一个 CSV 文件,最好在 DC 上以管理员身份在 PS 中运行。它还包括图片/音乐/视频,并将输出格式设置为可读和压缩:

$FileNameDate = Get-Date -UFormat "%Y%m%d_%H%M%S"
$OutFileName = ".\UserFolderStorage_" + $FileNameDate + ".csv"

$CSV_Header = '"Computer Name","User Folder","Documents (GB)","Desktop (GB)","Pictures (GB)","Music (GB)","Videos (GB)"'
$CSV_Header | Out-File -Encoding ascii $OutFileName

Get-ADComputer -Properties Name -Filter {Enabled -eq $true} | ForEach-Object { 
    $Comp = $_.Name
    if (Test-Connection -BufferSize 32 -Count 1 -ComputerName $Comp -Quiet) {
         foreach ($UserFolder in (Get-ChildItem \\$Comp\C$\Users -Directory)) {

         echo "Processing $UserFolder on $Comp"

         $DocumentsFolder = Join-Path ($UserFolder.FullName) 'Documents'
         $DesktopFolder = Join-Path ($UserFolder.FullName) 'Desktop'
         $PicturesFolder = Join-Path ($UserFolder.FullName) 'Pictures'
         $MusicFolder = Join-Path ($UserFolder.FullName) 'Music'
         $VideosFolder = Join-Path ($UserFolder.FullName) 'Videos'

         $DocumentsSize = "{0:N2}" -f ((Get-ChildItem -Path $DocumentsFolder -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB)
         $DesktopSize = "{0:N2}" -f ((Get-ChildItem -Path $DesktopFolder -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB)
         $PicturesSize = "{0:N2}" -f ((Get-ChildItem -Path $PicturesFolder -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB)
         $MusicSize = "{0:N2}" -f ((Get-ChildItem -Path $MusicFolder -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB)
         $VideosSize = "{0:N2}" -f ((Get-ChildItem -Path $VideosFolder -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB)

         $SummaryOutput = '"' + "$Comp" + '","' + "$UserFolder" + '","' + "$DocumentsSize" + '","' + "$DesktopSize" + '","' + "$PicturesSize" + '","' + "$MusicSize" + '","' + "$VideosSize" + '"'
         $SummaryOutput | Out-File -Encoding ascii $OutFileName -Append

         }
    }
    else {
         echo "$Comp NOT RESPONDING!"
         $SummaryOutput = '"' + $Comp + '","N/A - NOT RESPONDING","","","","",""'
         $SummaryOutput | Out-File -Encoding ascii $OutFileName -Append
    }
 }