例: AB5C8A~1
私が理解しているように、最初の 2 文字は通常のファイル名からのものです。DOS が 3 番目から 6 番目の文字に落ち着く方法の背後にある数学を教えてもらえますか?
wikiから、長いファイル名から 8.3 名を作成するための強制的なアルゴリズムはありませんが、規則に従おうとします。あなたの例のファイル名では、ファイル名のハッシュを使用して4桁の16進数を生成するオプション4を使用しているようです
いくつかのコードを見つけましたが、マイクロソフトが使用しているものと同じかどうかはわかりません...
ライセンスはこちらのサイトから
ここで彼らのシステムで利用可能なすべての(一部?)ソース
/* msdos_short_hex_number --
* Routine to set the hex number in the SFN.
*
* PARAMETERS:
* name - name to change
* num - number to set
*
* RETURNS:
* nothing
*
*/
static void
msdos_short_name_hex(char* sfn, int num)
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
*c++ = '~';
*c++ = '1';
}
Sean Cheshire は、彼の回答で良い参考文献を提供しています。しかし、ルールは部分的にしか文書化されていません。
完全なアルゴリズムが文書化されていたとしても、含まれているフォルダーの完全な履歴を知らずに、特定のファイルの 8.3 名を確実に予測する方法がわかりません。割り当てられる名前は、作成前に同じフォルダーに存在していた類似した名前のファイルの数によって異なります。
8.3 の名前を取得する唯一の信頼できる方法は、ディレクトリを照会することです。
最も簡単な方法は/x
、DIR コマンドのオプションを使用することですが、その出力は解析に適していません。
8.3 の名前を変数に入れる最も簡単な方法は~s
、FOR 変数または CALL パラメータで修飾子を使用することです。
for %%F in ("long file name.ext") do set "shortName=%~sF"
また
call :getShort "long file name.ext"
exit /b
:getShort
set "shortName=%~s1"
exit /b
注 - CALL の代わりに FOR を使用する方がはるかに高速です
8.3 の名前は、WMIC DATAFILE エイリアスからも入手できます。