Powershell Drive Letter から サーバーのアドレスを取得する


```Powershell
Get-CimInstance -ClassName Win32_LogicaLDisk | Where-Object{($_.DriveType -eq 4) -and ($_.ProviderName -notlike '*private*')} | Select-Object `
@{Name='ドライブ文字'; E={$_.DeviceID}}, `
@{N='ファイルシステム'; E={ $_.FileSystem}}, `
@{N='ドライブの種類'; E={$_.DriveType}}, `
@{N='割り当て'; E={$_.ProviderName}} , `
@{N='割り当てサイズ'; E={[System.Int64][Math]::Truncate($_.Size /1024 / 1024)}} , `
@{N='空き容量'; E={([System.Int64][Math]::Truncate($_.FreeSpace / 1024 /1024))}} `
 | Export-CSV 'C:\hoge\DriveletterUnicodeList.txt' -NoClobber -NoTypeInformation -Encoding Unicode -Delimiter `t
```

csvはUTF-8ではなくUnicode(UTF-16）で出力しているが、単純なCSVとしてExcelに読ませるならUTF-8でもよい。そちらが現在は汎用性が高い。

`\\Server\name\address`といった区画を`X:\`というドライブ文字に割り当てることはよくあります。
しかし、これを戻すことは意外とどこにもありません。
以前、VBAかVBSでもやっていますがPowershellでは上のようになります。色々やっていますが。なぜこんな色々やっているかというと、
出力される項目がことごとく予約語に近いため、変更する必要があるのと、サイズが数が大きくなりすぎるためです。
また、タブ区切りのCSVとして出力しています。この`Select-Object{}`で`@{Name='変更'; Expression={$_.propertyname}}
と言うのは辞書を作っているらしいです。最後が`}}`なのとコンマで続きますがNametとExpressionの間はセミコロンです。
この変更する項目名はMicrosoft Access等のフィールドの命名規則にしたがって予約後でないもの等の規則を守ってください。

[about_CimSession](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_cimsession?source=recommendations&view=powershell-7.3)
[Get-CimSession](https://learn.microsoft.com/ja-jp/powershell/module/cimcmdlets/get-cimsession?view=powershell-7.3)
[GitHub  List of Get-CimInstance's classnames? #5094 ](https://github.com/MicrosoftDocs/PowerShell-Docs/issues/5094)に同様の質問があり、Win32から来てPowershellに行くという感じで見つかります。

[CIMWin32 WMI Providers](https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/cimwin32-wmi-providers)
    +　[CIM WMI Provider](https://learn.microsoft.com/ja-jp/powershell/module/cimcmdlets/get-cimsession?view=powershell-7.3)
　　　　　[Win32_LogicalDisk クラス](https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-logicaldisk) 
　　　　　　ここで、4がネットワーク・サーバであることがわかる。

[How To List CIM Or WMI Class All Properties And Their Datatypes With PowerShell](https://www.improvescripting.com/how-to-list-cim-or-wmi-class-all-properties-and-their-datatypes-with-powershell/)

```SQL:Accessテーブル作成
CREATE TABLE T_W32LogicalDrvList(ID Counter Primary Key, ドライブ文字 TEXT(2),ファイルシステム TEXT(10), ドライブの種類 SMALLINT, 割り当て MEMO, 割り当てサイズ LONG, 割当空き容量 LONG);
```
Schema.ini

```scheme
[DriveletterUnicodeList.txt]
ColNameHeader=True
CharacterSet=Unicode
Format=CSVDelimited
MaxScanRows=1
TextDelimiter="
Col1=種類 Char Width 2
Col2=ファイルシステム  Char Width 10
Col3=ドライブの種類 Integer
Col4=割当 LongChar
Col5=割当サイズ Long
Col6=割当空き容量 Long
```

VBSCriptでもWMIを使用して取得することでこれと同様のことが可能である。


## 簡易な接続されているドライブの一覧の確認

```powershell
Get-PSDrive -PSProvider FileSystem
````

でも一覧形式で出力される。結果を確認するときに都合がよい。しかし、Xドライブに割り当てた場所はわからない。

## 仮想ドライブのCは難しい
この方法では仮想ドライブのCはわからない。しかし、別の方法により取得できる。WMIにありそうだが、現在のところC:は環境変数で出てきた分を使う方法しかない。
[Powershell 今日のトリビア Powershellの環境変数を直接Splitする方法](https://qiita.com/Q11Q/items/9b0a4b9da846f836f4ad)
もちろん、以下の代表的なテクニックも重要である。
今動かしているスクリプト自身のパスを取得する[スクリプトについて](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_scripts?view=powershell-7.3)にある実行しているスクリプトのパスを取得する自動変数`$PSCommandPath `(Ver3.0)
または
[スクリプトフォルダーの取得](https://www.vwnet.jp/windows/PowerShell/pwd.htm)の`$PSScriptRoot`及び`$MyInvocation.MyCommand.Path`(Ver2.0 Later)
[環境変数について](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.3)にある環境変数の取得
[現在の場所の管理](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.3)の以下のもの
 - ドライブのルートに行く `cd\`に相当する `Set-Location .. -paththru`
 - 現在のロケーションの`Get-Location`。
 - 現在のロケーションを移動する`Set-Location`
 - CMDの`PopD`、`PushD`と同じく`Push-Location`をカレントで行い、移動後`Pop-Location`で戻ることができる。
 - この機能はやはりCMD`PopD`、`PushD`と同様にネットワークドライブに一時的にドライブレターを割り当てられる。
 - ローカルを割り当てる方法は`New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem`