質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

1回答

6737閲覧

WindosServer2012R2で共有フォルダ(とそのサイズ)を一覧にしたい

moitaro

総合スコア443

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

0クリップ

投稿2018/02/22 02:31

お世話になっております。

WindosServer2012R2で共有フォルダ(とそのサイズ)を一覧にしたいと思っております。

PowerShellスクリプトを作成するしか無いのかと思って作成し
ふと途中でOSにそのような機能があるかと思いこちらに質問させて頂きます。

WindosServer2012R2で共有フォルダ(とそのサイズ)を一覧にしたいのですが
そのような命令はあるのでしょうか?

以下気がつくまでPowerShell書きかけ失礼します。
まだこのようなレベルなのです……

【kyouyuu.txt】

kyouyuu.txt

1D:\データ\sales 2D:\データ\SalesTool

【Get-DirSize.ps1】

Get

1#共有フォルダ名格納配列 2$folders=""; 3 4#共有フォルダ名格納配列に値を入れる。 5$i=1 6$txt = "c:\work\in.txt" 7$enc = [Text.Encoding]::GetEncoding("Shift_JIS") 8$fh = New-Object System.IO.StreamReader($txt, $enc) 9while (($l = $fh.ReadLine()) -ne $null) { 10 Write-Host $i : $l 11 $folders += $l 12 $i++ 13} 14 15#共有フォルダ名格納配列を順番にフォルダ名:配列処理 1617

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
Windows Server 2012 R2であれば共有フォルダの列挙はGet-SmbShareコマンドレットで可能です。

例)

powershell

1# -Special:$falseで管理共有(C$など)を除外 2Get-SmbShare -Special:$false

ただ、このコマンドレットでフォルダサイズは取得できず、PowerShell全般の問題としてフォルダのサイズ取得は一筋縄ではいきません...
基本的にはこちらのブログにある様に関数を自作してやる必要があります。


とりあえずの解として、上記の点を組み合わせて以下の様な感じで処理を実行することは可能です。
(フォルダサイズが大きいと時間がかかります)

powershell

1# この関数は 2# http://tech.guitarrapc.com/entry/2013/09/26/071905 3# より引用しています 4function Get-DirectoryVolume 5{ 6 7 [CmdletBinding()] 8 param 9 ( 10 [parameter( 11 position = 0, 12 mandatory = 1, 13 valuefrompipeline = 1, 14 valuefrompipelinebypropertyname = 1)] 15 [string[]] 16 $Path = $null, 17 18 [parameter( 19 position = 1, 20 mandatory = 0, 21 valuefrompipelinebypropertyname = 1)] 22 [validateSet("KB", "MB", "GB")] 23 [string] 24 $Scale = "KB", 25 26 [parameter( 27 position = 2, 28 mandatory = 0, 29 valuefrompipelinebypropertyname = 1)] 30 [switch] 31 $Recurse = $false, 32 33 [parameter( 34 position = 3, 35 mandatory = 0, 36 valuefrompipelinebypropertyname = 1)] 37 [switch] 38 $Ascending = $false, 39 40 [parameter( 41 position = 4, 42 mandatory = 0, 43 valuefrompipelinebypropertyname = 1)] 44 [switch] 45 $OmitZero 46 ) 47 48 process 49 { 50 $path ` 51 | %{ 52 Write-Verbose ("Checking path : {0}. Scale : {1}. Recurse switch : {2}. Decending : {3}" -f $_, $Scale, $Recurse, !$Ascending) 53 if (Test-Path $_) 54 { 55 $result = Get-ChildItem -Path $_ -Recurse:$Recurse ` 56 | where PSIsContainer ` 57 | %{ 58 $subFolderItems = (Get-ChildItem $_.FullName | where Length | measure Length -sum) 59 [PSCustomObject]@{ 60 Fullname = $_.FullName 61 $scale = [decimal]("{0:N4}" -f ($subFolderItems.sum / "1{0}" -f $scale)) 62 }} ` 63 | sort $scale -Descending:(!$Ascending) 64 65 if ($OmitZero) 66 { 67 return $result | where $Scale -ne ([decimal]("{0:N4}" -f "0.0000")) 68 } 69 else 70 { 71 return $result 72 } 73 } 74 } 75 } 76} 77 78# 管理共有を除いた共有フォルダの列挙 79Get-SmbShare -Special:$false | ForEach-Object { 80 # フォルダサイズの取得は気合いで頑張るしかない 81 $folderSize = Get-DirectoryVolume -Path $_.Path -Recurse -Scale MB | Measure-Object -Sum MB | Select-Object -ExpandProperty Sum 82 # 結果を出力 83 Write-Output ("{0}({1}) : {2}MB" -f $_.Name, $_.Path, $folderSize) 84}

投稿2018/02/22 03:57

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moitaro

2018/02/22 04:56 編集

stknohg様 素早い回答ありがとうございます。 やはりPowerShellで実装するしか無いのですね…… 勉強します。 この度は誠にありがとうございました。
stknohg

2018/02/22 05:40

OSの標準機能で一発取得、というのは私の知る限り無いです。 「コンピューターの管理」や「サーバーマネージャー」で共有フォルダの一覧は取れるのですがサイズまでは無理ですので...
moitaro

2018/02/23 02:49

stknohg様 コメントありがとうございます。 PowerShellで実装で実装するしか無い事を了解しました。 ですが上司から共有フォルダのひとつ下から結果が欲しいと言われて 組んでいる途中です……  質問を新規で立ち上げて良いのか不明ですが https://teratail.com/questions/114778 に手助け頂けますと嬉しく思います。 Get-SmbShare -Special:$false | ForEach-Object { のひとつ下の一覧は取得する方法が無いのでしょうか? お忙しいところ大変申し訳無いのですが ご助力頂けますと幸いです。
stknohg

2018/02/23 03:50

新しい質問に回答しておきました。
moitaro

2018/02/26 01:49

stknohg様 度々ありがとうございます。 ですが ``` ForEach-Object : 引数が null であるため、パラメーター 'Path' にバインドできません。 発生場所 C:\temp\teratail3.ps1:79 文字:32 + Get-SmbShare -Special:$false | ForEach-Object { + ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [ForEach-Object]、ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ForEachObjectCommand ``` とエラー表示されてしまうので もう最後の手段として共有フォルダを開いて 一つずつフォルダを右クリックをしてプロパティ>サイズ を表記するしかないのかな……と諦めを感じてきております。 勉強する書籍、URL等ご存知でしたら お教えいただけないでしょうか?
stknohg

2018/02/26 02:25

こちらのエラー、もう一つの質問のエラーなのか不明なのと、あくまで予想ですがこれまでの内容と別の環境で同じことしようとしていませんか? その辺があいまいなので答えようが無いのが率直なところです。 ここまでこじれてしまうと、無理に一発でやろうとするより、 ``` Get-DirectoryVolume -Path "フォルダ1" (後略) Get-DirectoryVolume -Path "フォルダ2" (後略) Get-DirectoryVolume -Path "フォルダ3" (後略) ・・・ (後略)・・・ ``` の様にGet-DirectoryVolumeを必要なフォルダ分書いてしまうのが手っ取り早いと思います。 これでも手作業よりは遥かに楽になると思います。 それでも厳しい様でしたら、現時点では、手作業でやるしかないでしょう。
stknohg

2018/02/26 02:30

あと、PowerShellを学ぶにあたって初学者向けにお勧めできる書籍って意外と無いんですよね。 (コマンドリファレンス、逆引き辞典といった書籍は多いのですが...) 個人的に、ゼロからPowerShellを学ぶにはこちらのサイトが良いかと思います。 http://ufcpp.net/study/powershell/
moitaro

2018/02/26 02:34

stknohg様 本当にありがとうございます。 上記サイトで勉強して次回からPowerShellで出来るようになりたいと思います。 とりあえず今は手動でやろうかと思います…… 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問