web-dev-qa-db-ja.com

cmd.exeを使用して長いファイル名を短いファイル名(8.3)に変換する

Windowsで長いファイル名を短いファイル名(8.3)に変換しようとしています。

コマンドライン引数を含むバッチファイルは、意図したとおりに機能します。

short.bat

@echo OFF
echo %~s1

short.bat C:\Documents and Settings\User\NTUSER.DATを呼び出すと、C:\DOCUM~1\USER\NTUSER.DATが返されます

ただし、このために余分な.batファイルが必要です。むしろ、Rubyスクリプトからのコマンド全体でcmd.exeを呼び出します。これを行うにはどうすればよいですか?

中間ステップとして、バッチファイルのパスをハードコードしようとしましたが、うまくいきません。

short1.bat

@echo OFF
SET filename="C:\Documents and Settings\User\NTUSER.DAT"
echo %filename%
echo %~sfilename%

echo %filename%は機能しますが、echo %~sfilename%は次のエラーを返します。

The following usage of the path operator in batch-parameter
substitution is invalid: %~sfilename%

For valid formats type CALL /? or FOR /?

short1.batが機能する場合、これをcmd.exe \c ...で呼び出すことができるワンライナーに変換するにはどうすればよいですか?

別の質問( Windowsパスの代わりにDOSパスを取得する方法 )がありますが、それは現在のディレクトリのパスを具体的に求めています。

30
user1251007
cmd /c for %A in ("C:\Documents and Settings\User\NTUSER.DAT") do @echo %~sA
41
dbenham

Filename.txtを8.3に変換するファイル名に置き換えます

dir /x filename.txt

次に、区切り文字として空白を使用して結果を分割する必要があります(正規表現では\ s)。その場合、〜の付いた値は短いファイル名です。ファイル名が短い場合は、〜を含む文字列は見つかりません。

5