[PowerShell]ディスク使用率を任意の値まで上げるスクリプト

こんにちは！れーあです。
なんだか久しぶりの投稿になります。

今回はディスクサイズを任意のサイズにできるスクリプトを作っていきます。

それではどうぞ。

## 前提情報

今回は前提条件としてPowerShellを「管理者として実行」する必要があります。

<b> スクリプト実行環境 </b>
```
PS C:\WINDOWS\system32> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  4648
```

## スクリプト内容
今回のスクリプトは下記です。
<b> 処理内容： </b>
　任意のパーセンテージを入力して、くっついている
　ディスクのディスク使用率が入力したパーセンテージになるよう
　サイズだけ大きいダミーファイルを作成する。

``` Disk_Usage_LimitTest.ps1
# 目標ディスク使用率を定義
$Want_Pct = Read-Host "Target Disk Usage Percentage? [1-100]"

# 定義外の指定値ではないことを判定
if($Want_Pct -match '[0-9]+$' -and !($Want_Pct -match '^0')){
	if([int32]$Want_Pct -le 100){
		$Disk_Pct = $Want_Pct / 100
		Write-Host "Set Disk Percentage:" $Want_Pct"%"
	}else{
		Write-Host "Error: Please Set Disk Usage Percentage 1 to 100."
		exit 1
	}
}else{
	Write-Host "Error: Please Set Disk Usage Percentage 1 to 100."
	exit 1
}

# 
foreach($Drive_Name in (Get-Volume |Where-Object {($_.DriveLetter).Length -eq 1 -and $_.DriveType -eq "Fixed" -and $_.OperationalStatus -eq "OK"}).DriveLetter){
	# ファイルサイズを定義 (ファイルサイズ = 目標ディスク使用サイズ - 現在ディスク使用サイズ)
	[int64]$File_Size = ((Get-Volume -DriveLetter $Drive_Name).Size * $Disk_Pct) - (((Get-Volume -DriveLetter $Drive_Name).Size) - ((Get-Volume -DriveLetter $Drive_Name).SizeRemaining))

	# ドライブに空きがあればテストファイルを作成する
	if($File_Size -gt 0){

		# テストファイル作成
			fsutil file createnew $Drive_Name":\test_file" $File_Size
			Write-Host "Disk Limit Test file successfully created."
	}else{
		Write-Host "Error: Not Enough Free Disk Space."
		exit 1
	}
}

```
## 気になる箇所
今回は「Get-Volume」を使用してディスクの値を取得しています。
foreachの中でWhere-Objectを使って、条件に一致する値だけを抽出するようにしています。

通常、「Get-Volume」だけ実行すると下記のような情報が表示されます。
```
PS C:\WINDOWS\system32> Get-Volume

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- ------------ -------------- --------- ------------ ----------------- -------------      ----
            SYSTEM       FAT32          Fixed     Healthy      OK                     69.14 MB     96 MB
C           Windows      NTFS           Fixed     Healthy      OK                    184.92 GB 237.48 GB
            Recovery     NTFS           Fixed     Healthy      OK                    356.89 MB    900 MB
```

こうしてみると、システム用やリカバリ用の領域まで表示されていることがわかると思います。今回は付与されているドライブだけを対象にしたいので「Where-Object」では下記条件に一致するディスクのドライブレターだけを抽出するようにしています。
本来的には①だけでよいのですが、②、③を指定している理由は、
意図しない動作を起こす可能性を減らしたいため、
ディスクドライブ(CD/DVD/BD)を対象から排除するためです。
　①ドライブレターが空白ではない
　②ドライブタイプが「Fixed」である
　③オペレーションステータスが「OK」である

 なお、ここの抽出条件はOSやPowerShellのバージョンによって異なる場合がありますので、適宜修正が必要な部分となります。
<br>

あとは今回「fsutil file」を利用してファイルを作成しました。
これを使用することで指定したファイル名、サイズでダミーファイルを作成することができます。
以前、「大量のファイルを作成するスクリプト」というものを書いたことがあるのですが、そちらでは「New-Item」を使用して0KBの空ファイルを作成していたのに対して、こちらではサイズを持ったファイルを作成することができます。
<br>

## 実際に動かしてみた
それでは実際に動かしてみましょう。
まずは、実行前のドライブの空き容量を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/8a96abb6-4a40-0873-ed0f-dcc225a61147.png)
<br>
ローカル端末なのでそれほど空きはないのですが、「53GB」の空き容量があるようです。

「管理者として実行」で開いたPowerShellからスクリプトを実行しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/0edcd078-ff3a-7522-b50b-27e6d120cd64.png)
<br>

何パーセントまで使用するかを聞かれますので、今回はわかりやすくするために「95」と入力してEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/e775f43b-f71a-52cb-6ead-0c9f45254549.png)
<br>
正常に作成されたメッセージが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/910d595f-21a4-d596-96e4-64cc09d69677.png)
<br>
Cドライブを見に行くと、下記のように使用率が上がっているのがわかると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/6229e6b0-4d30-1da6-fd43-4b65f1f70eda.png)
<br>

また、Cドライブ直下を見に行くと、ファイルサイズの大きいダミーファイルが作成されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/4bf07107-4f36-44d5-f240-36fdaa51349a.png)
<br>

なお、ディスク使用量が増えたままなのはよくないので、この作業が終わったらダミーファイルを削除しておきます。

## 注意点
本スクリプトを実行する上で注意する点が3つあります。

<b>1つ目：PowerShellを管理者として実行する</b>
スクリプトの内容上、ドライブ直下にダミーファイルを
作成するようになっています。
そのため、管理者として実行にしないとユーザーの権限によっては
アクセス拒否されてスクリプトが失敗する場合があります。
スクリプト上の指定パスを変更すれば問題はありませんが
実行権限は注意してみるようにしてください。

<b>2つ目：入力する値として100は極力入力しない</b>
仕様上、ディスクの使用率を
「100%」にすることもできるようになっています。
しかしながら、100%にした場合、最悪の場合、PCやサーバが壊れて
起動しなくなる恐れがあります。
可能なら「90%」ぐらいに留めておきましょう。

<b>3つ目：存在するすべてのディスク上にダミーファイルを作成する</b>
抽出条件のときにも記載しましたが、今回ディスクドライブについては
対象から除外しております。しかし、そのほかのディスクについては
すべてダミーファイルを作成するようになっています。
そのため、このドライブは別にダミーファイルを作りたくない等条件がある場合は、抽出条件の処理を変更する必要があります。
具体的には「Where-Object」の内容に「-and $_.DriveLetter -ne "ドライブレター"」を追加してあげることで対象から外すことができます。

## おわりに
ということで今回はディスクサイズを任意のパーセントにするスクリプトを作成してみました。
これを使用することで例えばディスク使用率のしきい値を
監視しているシステムのテストを行うことができます。
仕事中そういうテストのとき、手動でやるの面倒だなぁと思ったのが
今回のきっかけでした。

何かの参考になればと思います。

それではまた。


## 参考
https://learn.microsoft.com/en-us/powershell/module/storage/get-volume?view=windowsserver2022-ps

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/fsutil-file