バッチスクリプトで短いファイル名(SFN)を取得して、コマンドライン引数として8.3個の短いファイル名しか持たない古いプログラムに渡すときに問題が発生します。最後のコマンドの出力result=c:\DOCUME~1\Z12TXT~1.VIgs\z12.TXT.vi
でLFN名に2つの拡張がある場合、短いファイル名を取得
> dir /x *.vi
Volume in drive C is DSK_C
Volume Serial Number is FC79-4140
Directory of c:\Documents and Settings
08/04/2016 10:48 211 Z12TXT~1.VI z12.TXT.vi
08/04/2016 10:48 211 Z123TX~1.VI z123.TXT.vi
2 File(s) 422 bytes
0 Dir(s) 3,599,233,024 bytes free
> for /F "usebackq tokens=* delims=&" %A in (`echo "c:\Documents and Settings\z1
23.TXT.vi"`) do @echo "result=%~sfA"
"result=c:\DOCUME~1\Z123TX~1.VI"
> for /F "usebackq tokens=* delims=&" %A in (`echo "c:\Documents and Settings\z1
2.TXT.vi"`) do @echo "result=%~sfA"
"result=c:\DOCUME~1\Z12TXT~1.VIgs\z12.TXT.vi"
result=c:\DOCUME~1\Z12TX~1.VI
次のようになります。私はcmd.exeのではいくつかのテストここでプロンプトが問題を引き起こしていたものを見つけるために出力されました。私はdelims
を追加するようなさまざまな組み合わせを試しましたが、dir
をvarにスクレイピングする以外の解決策は見つかりませんでした。ファイル名が7文字(%~nA
部分)以下で、ピリオドが含まれている場合、%~sfA
または%~snxA
に間違った結果があるようです。それが正しいのですか、他の簡単な解決策がありますか?
編集4月12日: だけでパスを明確にすることは問題ではありませんが、上記の例では%~sfA
パスが破損しているが、%~sdpA
あなたはあなたに合わせてsourcedir
の設定を変更する必要がありますc:\DOCUME~1\Z12TXT~1.VI\
'.'はファイル名に合法です。最後の '.'の後の部分だけが拡張子です。 –
Ididn'tはそれが違法だと言って、私は合法だと言った。 –
これは正常だと言います。 –