在PowerShell中?

时间:2009-05-15 12:00:10

标签: windows powershell diskspace

如何使用PowerShell进行du - ish分析?我想定期检查磁盘上目录的大小。

以下给出了当前目录中每个文件的大小:

foreach ($o in gci)
{
   Write-output $o.Length
}

但我真正想要的是目录中所有文件的聚合大小,包括子目录。此外,我希望能够按大小排序,可选。

6 个答案:

答案 0 :(得分:28)

“探索美丽语言”博客上有一个实现:

"An implementation of 'du -s *' in Powershell"

function directory-summary($dir=".") { 
  get-childitem $dir | 
    % { $f = $_ ; 
        get-childitem -r $_.FullName | 
           measure-object -property length -sum | 
             select @{Name="Name";Expression={$f}},Sum}
}

(博客所有者代码:Luis Diego Fallas)

输出:

PS C:\Python25> directory-summary

Name                  Sum
----                  ---
DLLs              4794012
Doc               4160038
include            382592
Lib              13752327
libs               948600
tcl               3248808
Tools              547784
LICENSE.txt         13817
NEWS.txt            88573
python.exe          24064
pythonw.exe         24576
README.txt          56691
w9xpopen.exe         4608

答案 1 :(得分:20)

我稍微修改了答案中的命令以按大小降序排序,并以MB为单位包含大小:

gci . | 
  %{$f=$_; gci -r $_.FullName | 
    measure-object -property length -sum |
    select  @{Name="Name"; Expression={$f}}, 
            @{Name="Sum (MB)"; 
            Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } |
  sort Sum -desc |
  format-table -Property Name,"Sum (MB)", Sum -autosize

输出:

PS C:\scripts> du

Name                                 Sum (MB)       Sum
----                                 --------       ---
results                              101.297  106217913
SysinternalsSuite                    56.081    58805079
ALUC                                 25.473    26710018
dir                                  11.812    12385690
dir2                                 3.168      3322298

也许它不是最有效的方法,但它有效。

答案 2 :(得分:2)

在以前的答案的基础上,此方法适用于希望以KB,MB,GB等形式显示大小,并且仍然能够按大小排序的对象。要更改单位,只需将“ Name”和“ Expression =“中的“ MB”更改为所需的单位。您还可以通过更改“ 2”来更改要显示(四舍五入)的小数位数。

function du($path=".") {
    Get-ChildItem $path |
    ForEach-Object {
        $file = $_
        Get-ChildItem -File -Recurse $_.FullName | Measure-Object -Property length -Sum |
        Select-Object -Property @{Name="Name";Expression={$file}},
                                @{Name="Size(MB)";Expression={[math]::round(($_.Sum / 1MB),2)}} # round 2 decimal places
    }
}

这将大小作为数字而不是字符串(从另一个答案中可以看出),因此可以按大小排序。例如:

PS C:\Users\merce> du | Sort-Object -Property "Size(MB)" -Descending

Name      Size(MB)
----      --------
OneDrive  30944.04
Downloads    401.7
Desktop     335.07
.vscode     301.02
Intel         6.62
Pictures      6.36
Music         0.06
Favorites     0.02
.ssh          0.01
Searches         0
Links            0

答案 3 :(得分:1)

function Get-DiskUsage ([string]$path=".") {
    $groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } }
    foreach ($dn in $groupedList) {
        New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum }
    }
}
我有点不同;我将directoryname上的所有文件分组,然后遍历每个目录的列表构建总计(包括子目录)。

答案 4 :(得分:0)

如果您只需要该路径的总大小,则可以使用一个简化版本,

Get-ChildItem -Recurse ${HERE_YOUR_PATH} | Measure-Object -Sum Length

答案 5 :(得分:0)

使用以前的答案我自己的看法:

    const express = require('express');
    const router = express.Router();
    const bcrypt = require('bcryptjs');
    const config = require('config');
    const jwt = require('jsonwebtoken');
    const auth = require('../../middleware/auth');

    const User = require('../../models/User');

    //@action POST api/auth
    //@descr auth user
    //@access Public
    router.post('/', (req, res) => {
        const { email, password } = req.body

        if( !email || !password ) {
            return res.status(400).json({ msg: "Enter all fields."});
        }

        User.findOne({ email })
            .then(user => {
                if(!user) return res.status(400).json({ msg: "Nessun profilo trovato con questa email"});

                bcrypt.compare( password, user.password )
                    .then(isMatch => {
                        if(!isMatch) return res.status(400).json({ msg: "Password errata!"});

                        jwt.sign(
                            { id: user.id },
                            config.get('jwtSecret'),
                            { expiresIn: 10800 }, 
                            (err, token) => {
                                if(err) throw err;

                                res.json({
                                    token,
                                    user: {
                                        id: user.id,
                                        name: user.name,
                                        surname: user.surname,
                                        email: user.email,
                                        userPlus: user.userPlus
                                    }
                                })
                            }
                        )
                    })
            })
    });

    //@action GET api/auth/user
    //@descr GET user data
    //@access Private
    router.get('/user', auth, (req, res) => {
        User.findById(req.user.id)
            .select('-password')
            .then(user => res.json(user));
    });

    module.exports = router;