我需要递归地获取目录的大小。我必须每个月都这样做,所以我想制作一个PowerShell脚本来完成它。
我该怎么做?
答案 0 :(得分:23)
尝试以下
function Get-DirectorySize() {
param ([string]$root = $(resolve-path .))
gci -re $root |
?{ -not $_.PSIsContainer } |
measure-object -sum -property Length
}
这实际上会产生一些摘要对象,其中包括项目数。你可以抓住Sum属性,这将是长度之和
$sum = (Get-DirectorySize "Some\File\Path").Sum
编辑为什么这样做?
让我们通过管道的组件来分解它。 gci -re $root
命令将递归地从起始$root
目录中获取所有项目,然后将它们推送到管道中。因此$root
下的每个文件和目录都将通过第二个表达式?{ -not $_.PSIsContainer }
。传递给此表达式的每个文件/目录都可以通过变量$_
访问。前面的?表示这是一个过滤表达式,意味着只保留满足此条件的管道中的值。 PSIsContainer方法将为目录返回true。所以实际上过滤器表达式只保留文件值。最终的cmdlet度量对象将对管道中剩余的所有值的属性Length的值求和。所以它实际上是为当前目录下的所有文件调用Fileinfo.Length(递归)并对值进行求和。
答案 1 :(得分:3)
如果您想要包含隐藏文件和系统文件的大小,那么您应该将-force参数与Get-ChildItem一起使用。
答案 2 :(得分:3)
以下是获取特定文件扩展名大小的快捷方法:
(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum
答案 3 :(得分:1)
感谢那些发布在这里的人。我采用这些知识创造了这个:
# Loops through each directory recursively in the current directory and lists its size.
# Children nodes of parents are tabbed
function getSizeOfFolders($Parent, $TabIndex) {
$Folders = (Get-ChildItem $Parent); # Get the nodes in the current directory
ForEach($Folder in $Folders) # For each of the nodes found above
{
# If the node is a directory
if ($folder.getType().name -eq "DirectoryInfo")
{
# Gets the size of the folder
$FolderSize = Get-ChildItem "$Parent\$Folder" -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue;
# The amount of tabbing at the start of a string
$Tab = " " * $TabIndex;
# String to write to stdout
$Tab + " " + $Folder.Name + " " + ("{0:N2}" -f ($FolderSize.Sum / 1mb));
# Check that this node doesn't have children (Call this function recursively)
getSizeOfFolders $Folder.FullName ($TabIndex + 1);
}
}
}
# First call of the function (starts in the current directory)
getSizeOfFolders "." 0