2016-04-10 17 views
1

バッチスクリプトで短いファイル名(SFN)を取得して、コマンドライン引数として8.3個の短いファイル名しか持たない古いプログラムに渡すときに問題が発生します。最後のコマンドの出力result=c:\DOCUME~1\Z12TXT~1.VIgs\z12.TXT.viLFN名に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\

+0

'.'はファイル名に合法です。最後の '.'の後の部分だけが拡張子です。 –

+0

Ididn'tはそれが違法だと言って、私は合法だと言った。 –

+0

これは正常だと言います。 –

答えて

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o" 
SET "parent=%sourcedir%\" 
CALL :resolvedir 
for /F "tokens=4delims= " %%A in (' 
dir /x /a-d "%sourcedir%\*.vi"^|FINDstr /e /i /L ".vi" 
') do echo "result=%parent%%resultd%%%A" 


GOTO :EOF 

:resolvedir 
SET "resultd=" 
:rdloop 
FOR %%J IN ("%parent:~0,-1%") DO (
FOR /f "tokens=1*delims=\" %%G IN ("%parent%") DO IF "%%H"=="" (
    GOTO :eof 
) ELSE (
    FOR /F "tokens=1*delims=>" %%A IN ('dir /ad /x "%parent%\.."') DO (
    IF "%%B" neq "" FOR /f "tokens=1*delims= " %%D IN ("%%B") DO (
    IF /i "%%D"=="%%~nxJ" SET "resultd=%%D\%resultd%"&SET "parent=%%~dpJ" 
    IF /i "%%E"=="%%~nxJ" SET "resultd=%%D\%resultd%"&SET "parent=%%~dpJ" 
    ) 
) 
) 
) 

GOTO rdloop 

だろう状況。

私はソースディレクトリがドライブレターを含む完全なパス名であると仮定しています。間違いなく、これは通常の容疑者のような特定の文字に感受性を示すが、長い純粋なアルファベットとスペース、そして素敵な文字に名前を保ち、すべてがうまくいくはずである。


として短いディレクトリ名を解決する必要がない場合は、上記のは

sourcedirの設定と使用はテスト目的のためだけにある
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o" 
for /F "tokens=4delims= " %%A in (' 
dir /x /a-d "%sourcedir%\*.vi"^|FINDstr /e /i /L ".vi" 
') do echo "result=%%A" 

に簡素化します。

関連する問題