none
PS вывести размер папок RRS feed

  • Вопрос

  • Здравствуйте

    Пока получается вот так выводить 

    $source="D:\"
    Get-ChildItem $source | where {$_.psIscontainer} | foreach {
    $count = Get-ChildItem $_.fullname -recurse | Measure-Object -property length -Sum
    New-Object PSObject -property @{Folder=$_.FullName;Files=$count.count;Size=$count.Sum;}
    }

    Помогите допилить , нужно:

    1 указывать несколько дисков 

    2 вывод в МБ и ГБ 

    Пробовал делать вот так 

    $source="D:\"
    Get-ChildItem $source | where {$_.psIscontainer} | foreach {
    $count = Get-ChildItem $_.fullname -recurse | Measure-Object -property length -Sum
    New-Object PSObject -property @{Folder=$_.FullName;Files=$count.count;Size=$count.Sum / 1M;}
    }

    Пишит что конструкция не правильная =( 

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


    Сначала Вас игнорируют, потом над Вами смеются, потом с Вами борются, а затем Вы победили.

    10 января 2014 г. 5:55

Ответы

  • Для работы с путями 260 в PowerShell возникают трудности, поэтому лучше использовать стороннее решение(robocopy). Здесь используется русская версия, поэтому если язык отличный от русского,то заменить "(Файлов|Байт)" на свои значения.

    $source= "C:\","D:\","E:\"
    
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    }



    • Изменено KazunEditor 10 января 2014 г. 7:59
    • Предложено в качестве ответа Vector BCOModerator 10 января 2014 г. 8:10
    • Помечено в качестве ответа MR.Minion 10 января 2014 г. 8:13
    10 января 2014 г. 7:55
    Отвечающий
  • $source= "D:\","F:\"
    $time = Get-Date
    
    $result = @()
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		$result += New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    } 
    
    $result | Select Folder,"Size(Gb)","Size(mb)",Files |  
    	Export-CSV -NoType "c:\Reports\shd-$($time.ToString('ddMMyy')).csv" -Delimiter ";" -Encoding UTF8
    	
    	
    

    • Помечено в качестве ответа MR.Minion 10 января 2014 г. 11:26
    10 января 2014 г. 11:02
    Отвечающий

Все ответы

  • несколько дисков можно вот так

    Get-PSDrive -PSProvider:FileSystem
    $sources= Get-PSDrive -PSProvider:FileSystem
    
    ForEach ($source in $sources) {
    
    
    Get-ChildItem $source.Root | where {$_.psIscontainer} | foreach {
    $count = Get-ChildItem $_.fullname -recurse | Measure-Object -property length -Sum
    New-Object PSObject -property @{Folder=$_.FullName;Files=$count.count;Size=$count.Sum;}
    }
    }

    В моем случае все локальные диски. У себя естественно можете фильтровать по Name


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    10 января 2014 г. 6:18
  • Алексей , Ваш вариант подходит , но у меня много сетевых дисков подключено поэтому интересует как указать диски D:\ E:\ F:\, также хочется чтобы отчет выдавал данные в мегабайтах и гигабайтах и как убрать ограничение на количество знаков 

    Get-ChildItem : Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога - меньше 248 знаков.
    

    а то отчет получается раздробленным =(

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


    Сначала Вас игнорируют, потом над Вами смеются, потом с Вами борются, а затем Вы победили.


    • Изменено MR.Minion 10 января 2014 г. 7:10
    10 января 2014 г. 7:07
  • Выборочно диски : Get-psDrive -Name C,D,G и т.д.  По остальным моментам думаю....


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    10 января 2014 г. 7:27
  • Выборочно диски : Get-psDrive -Name C,D,G и т.д.  По остальным моментам думаю....


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Get-ChildItem : Не удается найти путь "C:\Users\chubaka\D", так как он не существует.
    строка:3 знак:14
    + Get-ChildItem <<<<  $source | where {$_.psIscontainer} | foreach {
        + CategoryInfo          : ObjectNotFound: (C:\Users\chubaka\D:String) [Get-ChildItem], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
     
    Get-ChildItem : Не удается найти путь "C:\Users\chubaka\F", так как он не существует.
    строка:3 знак:14
    + Get-ChildItem <<<<  $source | where {$_.psIscontainer} | foreach {
        + CategoryInfo          : ObjectNotFound: (C:\Users\chubaka\F:String) [Get-ChildItem], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

    Делаю вот так :

    $source = Get-psDrive -Name D,F
    
    Get-ChildItem $source | where {$_.psIscontainer} | foreach {
    $count = Get-ChildItem $_.fullname -recurse | Measure-Object -property length -Sum
    New-Object PSObject -property @{Folder=$_.FullName;Files=$count.count;Size=$count.Sum;}
    }

    Пробавал так тоже самое :

    $source = Get-psDrive -Name D:\,F:\


    Сначала Вас игнорируют, потом над Вами смеются, потом с Вами борются, а затем Вы победили.


    • Изменено MR.Minion 10 января 2014 г. 7:38
    10 января 2014 г. 7:35
  • Для подсчета в Мегабайтах измените строку

    $count.Sum / 1M на $count.sum / 1mb


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    10 января 2014 г. 7:37
  • Для работы с путями 260 в PowerShell возникают трудности, поэтому лучше использовать стороннее решение(robocopy). Здесь используется русская версия, поэтому если язык отличный от русского,то заменить "(Файлов|Байт)" на свои значения.

    $source= "C:\","D:\","E:\"
    
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    }



    • Изменено KazunEditor 10 января 2014 г. 7:59
    • Предложено в качестве ответа Vector BCOModerator 10 января 2014 г. 8:10
    • Помечено в качестве ответа MR.Minion 10 января 2014 г. 8:13
    10 января 2014 г. 7:55
    Отвечающий
  • Для работы с путями 260 в PowerShell возникают трудности, поэтому лучше использовать стороннее решение(robocopy). Здесь используется русская версия, поэтому если язык отличный от русского,то заменить "(Файлов|Байт)" на свои значения.

    $source= "C:\","D:\","E:\"
    
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    }



    Как правильно сделать экспорт в CSV

    Делаю вот так , не работает =(  :

    $source= "D:\","F:\"
    $time = (Get-Date)
    
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    } | Export-CSV -NoType c:\Reports\shd-$time.csv -Delimiter ;

    Хочу сделать чтобы создавался файл с названием  shd-время-создания.csv и такого формата :

    Folder;Size(Gb);Size(mb);Files


    Сначала Вас игнорируют, потом над Вами смеются, потом с Вами борются, а затем Вы победили.

    10 января 2014 г. 10:22
  • попробуйте вот так

    Export-CSV -NoType c:\Reports\shd-$($time.ToShortDateString()).csv -Delimiter ;


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    10 января 2014 г. 10:53
  • попробуйте вот так

    Export-CSV -NoType c:\Reports\shd-$($time.ToShortDateString()).csv -Delimiter ;


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Пустой элемент канала не допускается.
    At line:10 char:3


    Сначала Вас игнорируют, потом над Вами смеются, потом с Вами борются, а затем Вы победили.

    10 января 2014 г. 10:56
  • $source= "D:\","F:\"
    $time = Get-Date
    
    $result = @()
    foreach($d in $source)
    {
    	Get-ChildItem $d | where {$_.psIscontainer} | Foreach {
    		$r = robocopy $_.FullName c:\dummy /l /xj /e /nfl /ndl /njh /bytes /r:0
    		$data = $r -match "(Файлов|Байт)" -replace "\s+(Файлов|Байт)\s+:\s+" | Foreach {$_.split(" ")[0]}
    		$result += New-Object PSObject -Property @{Folder=$_.FullName;Files=$data[0];"Size(mb)"=$data[1]/1mb;"Size(Gb)"=$data[1]/1gb}
    	}
    } 
    
    $result | Select Folder,"Size(Gb)","Size(mb)",Files |  
    	Export-CSV -NoType "c:\Reports\shd-$($time.ToString('ddMMyy')).csv" -Delimiter ";" -Encoding UTF8
    	
    	
    

    • Помечено в качестве ответа MR.Minion 10 января 2014 г. 11:26
    10 января 2014 г. 11:02
    Отвечающий