none
Скрипт для подсчета размера папок RRS feed

  • Вопрос

  • Добрый день.

    Прошу не судить меня строго, в powershell я только начинаю.

    Есть задача, определить какой размер пользовательских папок в папке C:\Users\

    Накидал небольшой скрипт:

    cls
    $directory = Dir C:\users\ -Force
    $directory |
    Format-Table @{n="Имя пользователя"; e={$_.Name}}, @{n="размер папки"; e={$_.Length}} -AutoSize

    Он выводит результат в требуемом виде:

    Имя пользователя размер папки
    ---------------- ------------
    All Users                   1
    Default                     1
    Default User                1
    fssp                        1
    Public                      1
    resu                        1
    UpdatusUser                 1
    Все пользователи            1
    desktop.ini               174

    Проблема конечно  в том, что не показывает размер папок.

    Из google, я уже понял что Get-ChildItem не умеет выводит размер папок.

    Собственно вопрос: через что проще и удобнее мне как новичку решить задачу, чтобы был такой же результат только с размерами подпапок?

    Заранее благодарен


    • Изменено tosh1ba 29 марта 2017 г. 8:39
    29 марта 2017 г. 8:36

Ответы

  • http://www.powershelladmin.com/wiki/Get_Folder_Size_with_PowerShell,_Blazingly_Fast

    Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly

    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 9:22
    29 марта 2017 г. 8:53
    Отвечающий
  • тут смысл в том что для того чтобы вы могли посчитать корректный размер в самом простом случае у вас должны быть  права на все папки и подпапки пользователей(то есть если вы не можете просмотреть содержимое папки - вы не сможете посчитать ее размер ее содержимого).

    Затем вам не должен мешать UAC(в обычном случае он принудительно понижает привилегии, в том числе и админам).

    в случае если это проблематично - можно воспользоваться специальной привилегией(по мне так это ваще чистой воды вынужденный бекдор) - привилегией "SeBackupPrivilege" доступной(но не включенной по умолчанию) по дефолту админам и и членам группы бакап операторы (привилегия позволяет читать содержимое, даже если вам явно запрещено это в NTFS пермишенах). ну а собственно как еще бакапить данные?

    собственно варианты - воспользоватьсь сторонней тулзой которая может эту хрень включать, и специально ее использует для подсчета места.

    Воспользоваться встроенными тулзами (например robocopy c ключиком /B или /ZB), но тут таки вам придется парсить результаты, так как мерять место это не прямое предназначение тулзы.

    Вариант для совсем прошаренных - принудительно включать необходимые привилегии для скрипта\утилиты подсчета места - но таки это долго, дорого и хреново.

    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 9:20
    29 марта 2017 г. 9:13
  • Get-ChildItem C:\Users\ -Directory | Foreach {$_.FullName} | Get-FolderSize -RoboOnly
    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 11:10
    29 марта 2017 г. 10:14
    Отвечающий
  • Я привел поправленный скрипт, его и запускайте.
    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 11:57
    29 марта 2017 г. 11:54
    Отвечающий
  • Надеюсь , что не в ISE запускается скрипт?
    • Помечено в качестве ответа tosh1ba 1 апреля 2017 г. 3:39
    29 марта 2017 г. 16:19
    Отвечающий

Все ответы

  • у вас(у того пользователя под кем запускается скрипт) есть права на на все папки и подпапки в профилях?

    и если есть, скрипт вы запускаете с повышенными привилегиями(запустить как администратор)?

    самый простой вариант - запустить какую нить утилитку с правами админа типа(если не ошибаюсь) treesize

    29 марта 2017 г. 8:52
  • http://www.powershelladmin.com/wiki/Get_Folder_Size_with_PowerShell,_Blazingly_Fast

    Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly

    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 9:22
    29 марта 2017 г. 8:53
    Отвечающий
  • Я запускаю из ISE от администратора. тоесть ISE запущен с правами администратора. Разве этого не достаточно?

    Хотелось бы получить результат на Powershell, treesize слишком просто:)

    29 марта 2017 г. 8:58
  • Только подсчетом размера всех файлов в директории и поддиректориях вы сможете получить размер папки.

    $Test= Get-ChildItem C:\123 -Recurse |? {$_.Attributes -ne "Directory"}|measure -Property length -Sum
    "{0:N2}" -f $($Test.Sum/1MB) +"MB"

    На примере одной папки выше. А так вариантов развития дальше много, смотря что вам нужно.



    29 марта 2017 г. 8:59
  • Вот кстати не плохо описано, то что вам надо я так понимаю:

    http://windowsnotes.ru/powershell-2/opredelyaem-razmer-direktorii-s-pomoshhyu-powershell/

    29 марта 2017 г. 9:05
  • тут смысл в том что для того чтобы вы могли посчитать корректный размер в самом простом случае у вас должны быть  права на все папки и подпапки пользователей(то есть если вы не можете просмотреть содержимое папки - вы не сможете посчитать ее размер ее содержимого).

    Затем вам не должен мешать UAC(в обычном случае он принудительно понижает привилегии, в том числе и админам).

    в случае если это проблематично - можно воспользоваться специальной привилегией(по мне так это ваще чистой воды вынужденный бекдор) - привилегией "SeBackupPrivilege" доступной(но не включенной по умолчанию) по дефолту админам и и членам группы бакап операторы (привилегия позволяет читать содержимое, даже если вам явно запрещено это в NTFS пермишенах). ну а собственно как еще бакапить данные?

    собственно варианты - воспользоватьсь сторонней тулзой которая может эту хрень включать, и специально ее использует для подсчета места.

    Воспользоваться встроенными тулзами (например robocopy c ключиком /B или /ZB), но тут таки вам придется парсить результаты, так как мерять место это не прямое предназначение тулзы.

    Вариант для совсем прошаренных - принудительно включать необходимые привилегии для скрипта\утилиты подсчета места - но таки это долго, дорого и хреново.

    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 9:20
    29 марта 2017 г. 9:13
  • Задача похожая, но скрипт не рабочий:

    #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }

    результат:

    PS C:\Windows\system32> #Вводим имя директории
    $MainFolder = Read-Host ″Enter folder name″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:14 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:14 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression
     
    
    PS C:\Windows\system32> #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:14 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:14 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression
     
    
    PS C:\Windows\system32> cls
    #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:6 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:6 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:9 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:9 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:15 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:15 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression

    29 марта 2017 г. 9:14
  • Вот кстати не плохо описано, то что вам надо я так понимаю:

    http://windowsnotes.ru/powershell-2/opredelyaem-razmer-direktorii-s-pomoshhyu-powershell/

    вот как раз таки тут размер не посчитается корректно если внутри директории есть какая нить папка на которую нет прав\мешает уак\или еще что нить(в частности дефолтное ограничение на длину пути). тут как раз показательна папка Юзерс с профилями.

    в скрипте ссылку на которую привел казун, там как раз скрипт к робокопи обращается для решения подобных проблем.

    29 марта 2017 г. 9:19
  • Задача похожая, но скрипт не рабочий:

    #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }

    результат:

    PS C:\Windows\system32> #Вводим имя директории
    $MainFolder = Read-Host ″Enter folder name″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:14 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:14 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression
     
    
    PS C:\Windows\system32> #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:5 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:8 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:14 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:14 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression
     
    
    PS C:\Windows\system32> cls
    #Вводим имя директории
    $MainFolder = Read-Host ″E:\anton\″;
    #Определяем общий размер директории
    $MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
    $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ MB″;
    #Определяем размер файлов в корневой директории
    $MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
    $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    
    #Определяем размер всех поддиректорий
    $SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
    foreach ($folder in $subfolders) {
    $SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum; 
    $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    }
    строка:6 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:6 знак:14
    + $MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum / 1MB) + ″ ...
    +              ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:9 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:9 знак:15
    + $MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum / 1MB) + ″ MB″;
    +               ~
    Непредвиденная лексема "″" в выражении или операторе.
    строка:15 знак:19
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                   ~
    Необходимо предоставить выражение для значения справа от оператора "+".
    строка:15 знак:20
    + $folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
    +                    ~
    Непредвиденная лексема "″" в выражении или операторе.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : ExpectedValueExpression

    Ковычки поставьте нормальные
    29 марта 2017 г. 9:24
  • Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly

    результат:

    Get-FolderSize : The term 'Get-FolderSize' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is 
    correct and try again.
    At line:2 char:38
    + Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly
    +                                      ~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Get-FolderSize:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

    в чем может быть дело? Powershell версии 5

    29 марта 2017 г. 9:58
  • Дошло, нужно сначала установить скрипт

    Установил

    Теперь выдает:

    WARNING: fssp does not exist or is a file and not a directory. Skipping.
    WARNING: Public does not exist or is a file and not a directory. Skipping.
    WARNING: resu does not exist or is a file and not a directory. Skipping.
    WARNING: UpdatusUser does not exist or is a file and not a directory. Skipping.

    29 марта 2017 г. 10:03
  • Get-ChildItem C:\Users\ -Directory | Foreach {$_.FullName} | Get-FolderSize -RoboOnly
    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 11:10
    29 марта 2017 г. 10:14
    Отвечающий
  • WARNING: Path 'C:\Users\fssp' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\Public' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\resu' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\UpdatusUser' output from robocopy was not in an expected format.
    
    PS C:\Windows\system32> 

    я установил скрипт, модули, отдельно папку он считает а так не хочет

    Думаю вариант с Get-folderSize самый подходящий, помогите добить до конца плиз

    • Изменено tosh1ba 29 марта 2017 г. 11:30
    29 марта 2017 г. 11:02
  • Да с русским mui для robocopy, скрипт не расчитан.

    function Get-FolderSize {
        [CmdletBinding()]
        param(
            [Parameter(Mandatory=$true,
                       ValueFromPipeline=$true,
                       ValueFromPipelineByPropertyName=$true)]
    		[Alias("FullName")]
            [string[]] $Path,
            [int] $Precision = 4,
            [switch] $RoboOnly,
            [switch] $ComOnly,
    		[switch] $BackupMode,
            [ValidateRange(1, 128)] [byte] $RoboThreadCount = 16)
        begin {
            if ($RoboOnly -and $ComOnly) {
                Write-Error -Message "You can't use both -ComOnly and -RoboOnly. Default is COM with a fallback to robocopy." -ErrorAction Stop
            }
            if (-not $RoboOnly) {
                $FSO = New-Object -ComObject Scripting.FileSystemObject -ErrorAction Stop
            }
            function Get-RoboFolderSizeInternal {
                [CmdletBinding()]
                param(
                    # Paths to report size, file count, dir count, etc. for.
                    [string[]] $Path,
                    [int] $Precision = 4)
                begin {
                    if (-not (Get-Command -Name robocopy -ErrorAction SilentlyContinue)) {
                        Write-Warning -Message "Fallback to robocopy failed because robocopy.exe could not be found. Path '$p'. $([datetime]::Now)."
                        return
                    }
                }
                process {
                    foreach ($p in $Path) {
                        Write-Verbose -Message "Processing path '$p' with Get-RoboFolderSizeInternal. $([datetime]::Now)."
                        $RoboCopyArgs = @("/L","/S","/NJH","/BYTES","/FP","/NC","/NDL","/TS","/XJ","/R:0","/W:0","/MT:$RoboThreadCount")
    					
    					if($BackupMode) {
    						 $RoboCopyArgs += "/B"
    					}
    					
                        [datetime] $StartedTime = [datetime]::Now
                        [string] $Summary = robocopy $p NULL $RoboCopyArgs | Select-Object -Last 8
                        [datetime] $EndedTime = [datetime]::Now
                        [regex] $HeaderRegex = '\s*(Total|Всего)\s*(Copied|Скопировано)\s*(Skipped|Пропущено)\s*(Mismatch|Несоответствие)\s*(FAILED|СБОЙ)\s*(Extras|Дополнения)'
                        [regex] $DirLineRegex = '(Dirs|Каталогов)\s*:\s*(?<DirCount>\d+)(?:\s*\d+){3}\s*(?<DirFailed>\d+)\s*\d+'
                        [regex] $FileLineRegex = '(Files|Файлов)\s*:\s*(?<FileCount>\d+)(?:\s*\d+){3}\s*(?<FileFailed>\d+)\s*\d+'
                        [regex] $BytesLineRegex = '(Bytes|Байт)\s*:\s*(?<ByteCount>\d+)(?:\s*\d+){3}\s*(?<BytesFailed>\d+)\s*\d+'
                        [regex] $TimeLineRegex = '(Times|Время)\s*:\s*(?<TimeElapsed>\d+).*'
                        [regex] $EndedLineRegex = '(Ended|Окончание)\s*:\s*(?<EndedTime>.+)'
                        if ($Summary -match "$HeaderRegex\s+$DirLineRegex\s+$FileLineRegex\s+$BytesLineRegex\s+$TimeLineRegex\s+$EndedLineRegex") {
                            $TimeElapsed = [math]::Round([decimal] ($EndedTime - $StartedTime).TotalSeconds, $Precision)
                            New-Object PSObject -Property @{
                                Path = $p
                                TotalBytes = [decimal] $Matches['ByteCount']
                                TotalMBytes = [math]::Round(([decimal] $Matches['ByteCount'] / 1MB), $Precision)
                                TotalGBytes = [math]::Round(([decimal] $Matches['ByteCount'] / 1GB), $Precision)
                                BytesFailed = [decimal] $Matches['BytesFailed']
                                DirCount = [decimal] $Matches['DirCount']
                                FileCount = [decimal] $Matches['FileCount']
                                DirFailed = [decimal] $Matches['DirFailed']
                                FileFailed  = [decimal] $Matches['FileFailed']
                                TimeElapsed = $TimeElapsed
                                StartedTime = $StartedTime
                                EndedTime   = $EndedTime
    
                            } | Select Path, TotalBytes, TotalMBytes, TotalGBytes, DirCount, FileCount, DirFailed, FileFailed, TimeElapsed, StartedTime, EndedTime
                        }
                        else {
                            Write-Warning -Message "Path '$p' output from robocopy was not in an expected format."
                        }
                    }
                }
            }
        }
        process {
            foreach ($p in $Path) {
                Write-Verbose -Message "Processing path '$p'. $([datetime]::Now)."
                if (-not (Test-Path -Path $p -PathType Container)) {
                    Write-Warning -Message "$p does not exist or is a file and not a directory. Skipping."
                    continue
                }
                # We know we can't have -ComOnly here if we have -RoboOnly.
                if ($RoboOnly) {
                    Get-RoboFolderSizeInternal -Path $p -Precision $Precision
                    continue
                }
                $ErrorActionPreference = 'Stop'
                try {
                    $StartFSOTime = [datetime]::Now
                    $TotalBytes = $FSO.GetFolder($p).Size
                    $EndFSOTime = [datetime]::Now
                    if ($TotalBytes -eq $null) {
                        if (-not $ComOnly) {
                            Get-RoboFolderSizeInternal -Path $p -Precision $Precision
                            continue
                        }
                        else {
                            Write-Warning -Message "Failed to retrieve folder size for path '$p': $($Error[0].Exception.Message)."
                        }
                    }
                }
                catch {
                    if ($_.Exception.Message -like '*PERMISSION*DENIED*') {
                        if (-not $ComOnly) {
                            Write-Verbose "Caught a permission denied. Trying robocopy."
                            Get-RoboFolderSizeInternal -Path $p -Precision $Precision
                            continue
                        }
                        else {
                            Write-Warning "Failed to process path '$p' due to a permission denied error: $($_.Exception.Message)"
                        }
                    }
                    Write-Warning -Message "Encountered an error while processing path '$p': $_"
                    continue
                }
                $ErrorActionPreference = 'Continue'
                New-Object PSObject -Property @{
                    Path = $p
                    TotalBytes = [decimal] $TotalBytes
                    TotalMBytes = [math]::Round(([decimal] $TotalBytes / 1MB), $Precision)
                    TotalGBytes = [math]::Round(([decimal] $TotalBytes / 1GB), $Precision)
                    BytesFailed = $null
                    DirCount = $null
                    FileCount = $null
                    DirFailed = $null
                    FileFailed  = $null
                    TimeElapsed = [math]::Round(([decimal] ($EndFSOTime - $StartFSOTime).TotalSeconds), $Precision)
                    StartedTime = $StartFSOTime
                    EndedTime = $EndFSOTime
                } | Select Path, TotalBytes, TotalMBytes, TotalGBytes, DirCount, FileCount, DirFailed, FileFailed, TimeElapsed, StartedTime, EndedTime
            }
        }
        end {
            if (-not $RoboOnly) {
                [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($FSO)
            }
            [gc]::Collect()
            [gc]::WaitForPendingFinalizers()
        }
    }

    Выполнение:

    Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly
    
    или
    Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly -BackupMode 

    29 марта 2017 г. 11:36
    Отвечающий
  • к сожалению сообщение тоже самое :(

    PS C:\Windows\system32> Get-ChildItem C:\Users\ -Directory | Get-FolderSize -RoboOnly -BackupMode 
    WARNING: Path 'C:\Users\fssp' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\Public' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\resu' output from robocopy was not in an expected format.
    WARNING: Path 'C:\Users\UpdatusUser' output from robocopy was not in an expected format.

    29 марта 2017 г. 11:52
  • Я привел поправленный скрипт, его и запускайте.
    • Помечено в качестве ответа tosh1ba 29 марта 2017 г. 11:57
    29 марта 2017 г. 11:54
    Отвечающий
  • Да, я это понял,  я его скопировал и запустил. Последний комментарий уже после запуска вашего скрипта. 
    29 марта 2017 г. 11:58
  • скрипт с повышенными правами запускаете?

    дайте вывод команды:

    robocopy "C:\Users\Public" "c:\ttmp" /L /S /E /ZB /BYTES /NDL /NJH

    treesize пробовали смотреть? (его тож под админом надо запускать)


    • Изменено Svolotch 29 марта 2017 г. 14:40
    29 марта 2017 г. 14:38
  •  Ќ®ўл© д ©« 		     174	C:\Users\Public\desktop.ini
    
    ------------------------------------------------------------------------------
    
                   ‚ᥣ®‘Є®ЇЁа®ў ­® Џа®Їг饭®ЌҐб®®вўҐвбвўЁҐ      ‘ЃЋ‰„®Ї®«­Ґ­Ёп
    Љ в «®Ј®ў :         1         1         0         0         0         0
      ” ©«®ў :         1         1         0         0         0         0
        Ѓ ©в :       174       174         0         0         0         0
       ‚६п :   0:00:00   0:00:00                       0:00:00   0:00:00
    
    ЋЄ®­з ­ЁҐ : Wed Mar 29 17:39:56 2017
    PS C:\Windows\system32> 
    treesize пока не смотрел
    29 марта 2017 г. 14:40
  • взбугагнул.. :-) скрипт пыкается эти крокозябли распознать и не выходит из него аленький цветочек :-)
    поддержку русского для не юникод программ поставьте.
    • Изменено Svolotch 29 марта 2017 г. 14:46
    29 марта 2017 г. 14:45
  • подскажите как если можно?
    29 марта 2017 г. 14:46
  • стоп, он же там по дефолту уже стоять должен
    вот нет к сожалению русской
    29 марта 2017 г. 15:00
  • вот не уверен кстати что поможет, или кодировка консоли такая или ваще хз.... нет под рукой русской винды чтоб проверить.

    попробуйте в консоль добавить команду 

    chcp 1251

    затем снова пример вывода из робокопи(который выше)

    29 марта 2017 г. 15:05
  • Надеюсь , что не в ISE запускается скрипт?
    • Помечено в качестве ответа tosh1ba 1 апреля 2017 г. 3:39
    29 марта 2017 г. 16:19
    Отвечающий
  • Действительно, все прекрасно работает если запускать не через ISE

    Подскажите пожалуйста, почему через ISE не срабатывает?

    1 апреля 2017 г. 3:42