2011-07-12 18 views
2

Windowsバッチプログラミングでファイルの名前を読みたい。私はさまざまな方法を使って試していますが、失敗しました。Windowsバッチプログラミングでファイル名を読む

シナリオを以下に示します。

私はフォルダ内に異なるファイルを持っていますが、ファイル名の長さはすべてのファイルで同じです。 など。

1000342578_30062011.PDF 
1000342329_30062011.PDF 

そして私はちょうど_後、変数で.PDF(例えば30062011)の部分前の部分を保存しておきたいです。

以下は試してみましたが、私は解決できません。 @Alex K.の回答に基づいて

@echo off 
echo.Date : %date% 
echo.Year : %date:~10,4% 
dir /s /b C:\Users\zeeshando\Desktop\*.txt 
for %%x in (c:\temp\*.xls) do echo %%x 
lfnfor off 
for %%x in (*.*) do echo %%x > filelist.txt 
PAUSE 
for %i in (C:\Users\zeeshando\Desktop) do 
    echo %~ni 
PAUSE 

UPDATE

私の現在のコード、:

@setlocal enabledelayedexpansion 
for %%x in (C:\Hi\*.*) do (
    set fn=%%x 
    set fn=!fn:~22,8! 
    echo !fn! 
    call:handler 
) 
goto:eof 

:handler 
echo !fn! 
copy C:\Hi\*.* E:\!fn! 
goto:eof 


PAUSE 

しかし、それはファイルをコピーされていません。上記のコードを確認してください。

+0

VBScriptをご存知ですか?その文字列操作ライブラリは[使いやすい]です(http://www.w3schools.com/vbscript/vbscript_ref_functions.asp#string) – bobobobo

+0

あなたの質問を更新したい場合は**新しい情報を**追加してください** **投稿の内容全体を完全に置き換えないでください。 –

答えて

0

固定長であるため、:~startpos,len構文を使用できます。

set fn=1000342578_30062011.PDF 
set fn=%fn:~11,8% 
echo %fn% 

>30062011 

forループです。

setlocal enabledelayedexpansion 
for %%x in (*.*) do (
    set fn=%%x 
    set fn=!fn:~11,8! 
    call:handler 
) 
goto:eof 

:handler 
    echo !fn! 
goto:eof 
+0

私は文字列を分割する方法を知っていますが、文字列をファイル名から取り出して分割する方法は知られていませんか? – Mareena

+0

FORの中で私が上記のように更新した場合 –

+0

これは私のために働いていますが、ある程度、エコーが必要なために値をグローバルに設定する方法はありますか! for()paranthesisの後の値?? – Mareena

2

これは、_と_を使用してforループで実行できます。区切り文字として、次のように:

FOR /F "tokens=2 delims=_." %%i IN ('DIR /b C:\Users\zeeshando\Desktop\*_*.*') DO ECHO %%i 
+0

出力されていない出力... – Mareena

+0

私は現在次のコードを使用していますが、その出力上記のdirstoryに複数のファイルがあるにもかかわらず、何もありません。 @echo off FOR/F "tokens = 2 delims = _。" %%では、私は( 'DIR/BのD:\のBPM \ PDFファイルの\ PDF * _ * *')ECHO %%あなたは、バッチファイルまたは単にコマンドラインからI PAUSE – Mareena

+0

を \tをテストしているのですか?コマンドラインから直接実行している場合は、%% iの代わりに%iを使用してください。 – Dave

1
@ECHO OFF 
SET "destpath=destinationPath" 
FOR %%f IN (sourcePath\*.*) DO CALL :process "%%f" 
GOTO :EOF 

:process 
SET srcfile=%1 
SET "name=%~n1" 
SET "name=%name:*_=%" 
COPY %srcfile% "%destpath%\%name%" 

SET "name=%~n1"ラインは、拡張子なしの完全なパスから名前だけを抽出します。

SET "name=%name:*_=%"行は、nameの値の前に_文字とそのすべてを削除し、結果をnameに戻します。

最終的には、コマンドを実行する前に、nameには元のファイル名の部分が含まれています(_と拡張子の間)。