Windows Cmd/Powershell でチルダ補完パスを解決する方法

Windows Cmd/Powershell でチルダ補完パスを解決する方法

いくつかのアプリケーションのアンインストールを自動化しようとしています。そのうちの 1 つが XtremeTuner です。XtremeTuner は、アンインストールに使用するコマンドをキーの下のレジストリに保存しますHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XtremeTuner。私のマシンでは、キーの値は次のようになります。

C:\PROGRA~2\XTREME~1\XTREME~1\UNWISE.EXE C:\PROGRA~2\XTREME~1\XTREME~1\INSTALL.LOG

最初は間違っていると思いましたが、パスは実際に機能します。チルダ文字の後に数字を続けると、タブ展開のような動作が実行されることがわかりました。少しエラーが発生しやすいですが、問題ありません。たとえば、次のようになります。

  • C:\Program~1解決するC:\Program Files
  • C:\Program~2解決するC:\Program Files (x86)
  • C:\Program~3解決するC:\ProgramData

Powershell はそれを認識しているようですが、すべてのソフトウェアが認識しているわけではありません (たとえば、Chocolatey はパスを検証し、それが間違っていると判断します)。

私の質問:

  1. このメカニズムは何と呼ばれているのでしょうか? 今のところは「チルダ補完」と呼んでいますが、おそらく別の名前があるでしょう。
  2. このチルダで補完されたパスを通常のパスに解決するにはどうすればよいでしょうか?

答え1

このメカニズムは何と呼ばれますか?

これらは「8.3 名前「ファイル名がこのサイズに制限されていた 16 ビット MS-DOS および Windows 3.x ソフトウェアとの互換性のために生成されました。

(これらのオペレーティング システムのファイル アクセス API には、この固定長の想定が組み込まれているため、Win16 または DOS 用に作成された古いプログラムは、それ以降のバージョンの Windows で実行した場合でも、この制限の影響を永続的に受けます。そのため、Windows では長い名前に対して短いエイリアスが提供されており、ユーザーは新しい Windows 95 マシンで古いプログラムを実行できます。)

このパスが表示されるのは、WISE インストール システムの古いバージョンが、実際には 16 ビット ランチャーで 32 ビット インストーラーを生成したためである可能性があります (これは、一般的な「無効な .exe ファイル」ではなく、Windows 3.x でわかりやすいエラー メッセージを表示することを目的としています)。

チルダ文字の後に数字を続けると、タブ展開のような動作が行われることがわかりました。少しエラーが発生しやすいですが、問題ありません。

いいえ、チルダは実際には拡大まったく同じファイルまたはフォルダ文字通り両方の名前を持つ8.3 形式の名前は、Windows が生成する 8.3 形式の名前の一部です (FAT 形式のディスクを扱う一部のオペレーティング システムでは、8.3 形式の名前を生成することが知られています)。それなしチルダ。

したがって、拡張はユーザー空間ではなくファイルシステム自体によって行われます。FAT または NTFS ドライバーは、同じフォルダーが同時に と と名付けられていることを認識しますProgram FilesPROGRA~1推測は必要ありません。アイテムが作成または名前変更されるたびに、8.3 形式の名前が静的に割り当てられます (コマンド プロンプトで現在の 8.3 形式の名前を確認できますdir /x)。また、PROGRA~2 が削除されても、PROGRA~3 は常に PROGRA~3 のままです。

これは、ファイルパスが使用される場所では、両方完全な名前と 8.3 短縮名は、後者がディレクトリ一覧から隠されているにもかかわらず、同じように受け入れられるはずです。8.3 名を受け入れないプログラムは、通常、何か間違っています。

(NTFS ディスク上の 8.3 名の生成は無効にできるため、dir /xコマンドで一部の名前が欠落していることがわかる場合があります。ただし、8.3 生成を無効にしても、以前に割り当てられた名前は無効になりません。)

このチルダで補完されたパスを通常のパスに解決するにはどうすればよいでしょうか?

Win32 APIを通じて、長いパス名を取得する()またはフルパス名を取得する()

PowerShell を使用すると、(Get-Item).FullName次のものにアクセスしたり、次の操作を実行できます(Get-ChildItem).FullName

PS C:\Users\Foo> (get-item -force "c:\users\foo\virtua~1").Name
.VirtualBox

PS C:\Users\Foo> (get-item -force "c:\users\foo\virtua~1").FullName
C:\Users\Foo\.VirtualBox

PS C:\Users\Foo> get-item -force docume~1,micros~1,virtua~1 | ft Name,FullName

Name                 FullName
----                 --------
Documents            C:\Users\Foo\Documents
MicrosoftEdgeBackups C:\Users\Foo\MicrosoftEdgeBackups
.VirtualBox          C:\Users\Foo\.VirtualBox

関連情報