2017-06-22 6 views
0

コンテキスト: AFSM-DDMMYY_doe-john.jpgの形式で名前が付けられた約100個のjpgイメージから始め、それらの名前に基づいてフォルダにソートされます次のスクリプト:サブディレクトリを使ってバッチファイルループを作成する方法

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "folder1=!filename1:~12,-4!" 
    mkdir "!folder1!" 2>nul 
    move "!filename1!" "!folder1!" >nul 
) 

foldercreator.bat画像はこれは以下のスクリプトを使用して行われAFSM-DDMMYY.jpgのフォーマットで終わるので、私は、ファイル名の_last-最初の部分を削除します:

nameremover.bat

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "name1=!filename1:~0,11!" 
    ren "!filename1!" "!name1!.jpg" 
) 

結果のフォルダは、最終的にAFSM-DDMMYY.jpgイメージを含むdoe-johnという名前になります。これらのフォルダはすべてこの目的のための共通フォルダ内にあります。これは素晴らしいですが、私はそれを各フォルダに移動してそこで個別に実行する必要がなく、すべてのdoe-johnフォルダ全体で実行されるように、commonフォルダ内からnameremover.batを実行できるようにしたいと考えています。前もって感謝します。

+0

ファイル名を '_'文字ではなく文字の位置で分割する特別な理由はありますか?名前に複数の '_ 'があってもよいでしょうか? – aschipfl

答えて

0

簡単な方法は、バッチファイルを格納するディレクトリを作成することです。一般名はbatchまたはbelfryで、ディレクトリ名はpath変数に含めます。これにより、現在のディレクトリに関係なく、ディレクトリ内のバッチファイルが実行される可能性があります。

ああ - ところで:なぜあなたは自分の最初のバッチで

move "!filename1!" "!folder1!\!filename1:~0,11!!filename1:~-4!" >nul 

を使用していませんか?

実行されるファイルになります、あなたが実行可能な(例えば c:\some\directory\executable.exe)へのパスを指定

。ただし、ディレクトリを省略して単にexecutable.exeを実行すると、現在のディレクトリ内のファイルの検索が試行されます。これが失敗すると、環境変数pathが検査され、pathにある最初に一致する実行可能ファイルが実行されます。

したがって、あなたはあなたのpathは、ディレクトリのようなc:\batchexecutablename.exec:\batchディレクトリに存在する場合、それを実行する実行可能ファイルを実行しようとする試みを含めるように変更した場合。

実行可能ファイルは、(そうfred.のそれぞれにfred.batfred.cmdfred.exeを探します実行、.bat.cmd.exeであり、そのベース名を使用して呼び出すことができる最も重要なものは、多くのフレーバーで来ますカレントディレクトリ)と%path%(directorynamesのセミコロン区切りリストを含む環境変数)

あなたウィンドウを使用してパスが、変更することができますpath editor(Google it)のようなサードパーティーのユーティリティーは簡単です。

だから - あなたが必要とするすべてはあなたのバッチファイルを格納するディレクトリを確立している(すでに(mkdirコマンドを使用して、あなたの投稿をバッチでこれをやっている、それはmkdirの同義語)であるmdを使用する方が一般的ですが)そして、バッチをそのディレクトリに移動し、現在のディレクトリの場所に関係なく、そのバッチ名を使用してバッチを実行することができます。

実際には、私はそこにバッチ以上のものを保存しています - 私はすべての私のユーティリティ.exeにも同様に使用しています - 例えばsedです。

あなたのコードの分析は、

は& SETLOCAL

&カスケード2つのコマンドをオフ@echo。 @echo off turnsコマンドをエコーするoffおよびsetlocalは、環境の変更(作成または削除された変数など)がバッチの最後に元の状態に復元されるようにするローカル環境を確立します。これは、追加/削除/変更/移動されたファイルを復元するのではなく、環境変数だけを復元することに注意してください。/F "delims =" %% iの( 'DIR/B /広告* .JPG')は(

はすべて.jpgのファイルを検索しdirコマンドを実行しないための

、名前だけなしディレクトリ名、ファイルであるかのように。メモリにこのリストを置く。、リストを「読む」行ずつひいては%%iに各行の内容を割り当てる。

セット「ファイル名1 = %%〜I "

環境変数filename1%%i = dir行の内容に設定します。

SETLOCAL enabledelayedexpansion

NEST新しいローカル環境、しかしとき、それはあったように、この1は!var!varの値を「var%var%一方手段の現在の値」を意味するようにdelayedexpansionを呼び出しましたfor **が見つかりました**

"folder1 =!filename1:〜12、-4!"

は、13文字(カウントは「文字0」から始まる)から、最後から4番目の文字に、filename1現在値にfolder1を設定します。

mkdir "!folder1!"2> NUL

は、そのディレクトリを作る抑制し、エラーメッセージ( 'はすでに存在している' のような)

移動 "!ファイル名1!" "!のfolder1のを!"> NUL

を新しいディレクトリにファイルを移動

"folder1!" is a directory, the file will be moved into that directory. If it didn't exist, the移動would move the file to a **file** namedので "!folder1の!" `

... code blockの末尾が(の後にdoの数行前に開始されます。

注意

setlocalネストされたローカル環境を確立します。これらは限られています。ローカル環境を終了するにはmoveコマンドの後にendlocalコマンドを配置する必要があります。そのため、コードは処理される各ファイルのローカル環境を作成して削除する必要があります。

だから、私が提唱moveに置き換えmoveで、変更は、移動のための宛先が

[ filename1から filename1 +最後の4つの文字の最初の12文字\ folder1におけるターゲットディレクトリ]があることを意味します

であり、これはプロセスを回避するだろう。

IOW、

@echo off &setlocal 
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
    set "filename1=%%~i" 
    setlocal enabledelayedexpansion 
    set "folder1=!filename1:~12,-4!" 
    mkdir "!folder1!" 2>nul 
    move "!filename1!" "!folder1!\!filename1:~0,11!!filename1:~-4!" >nul 
    ENDLOCAL 
) 

'nameremover' ステップを実行する必要がなく、あなたの処理を行う必要があります。これをpathに変更した後に\batchディレクトリに置き、別のドライブにログインしている場合を含め、システムのどこにいてもプロンプトから直接コードを実行できるはずです。


メニューを確立するため、従来のアプローチがある:プロンプトで

:again 
cls 
echo 1. do thing 1 
echo 2. do thing 2 
echo 3. do thing 3 
echo q quit 
choice /c 123q /m please choose... 
if errorlevel 4 goto :eof 
if errorlevel 3 call batch3&goto again 
if errorlevel 2 call batch2&goto again 
if errorlevel 1 call batch1&goto again 
goto again 

choice /?方法choice作品のガイドを得られます。

errorlevelは、 /c内の文字位置に基づいて設定されたキーの文字列です。 errorlevelがn 以上コード Nよりなる逆値の順に構築する必要がある場合if errorlevel nので

は真です。

実行されるコードはおそらくerrorlevelの値を変更します。からの返品が、 、残りのif errorlevelステートメントでは返答されないことを保証するために、 サブミットを実行した後にgotoが必要です。

+0

お返事ありがとうございました。なぜなら私はこれまでバッチファイルを使ったことがないからです。しかし、この特定のプロジェクトはそれを必要とするので、私はインターネット上で少ししか見つからず、自分のニーズに合ったものを作り出しています。ディレクトリをどのように実装するのか、最初のバッチファイルと提案された変更の違いは何ですか?ありがとうございました。 – Frazier

+0

家に帰って試してみることができました。完璧に動作し、私はあなたがしたことをどのようにしたのかを説明する時間をとっていただきありがとうございます。とても有難い。 – Frazier

+0

あなたはバッチファイルの仕方に非常に精通しているようですので、私がさらに助けてくれるかどうか疑問に思っていました。あなたが私に与えたスクリプトは驚くほど走り、本当に感謝しています。私が実行していることの一つは、私が頻繁に生成するファイル名の種類がたくさんあるということです。これらの状況ごとに作成したバッチファイルを編集して、バッチファイルをたくさん用意しました。スクリプトを実行すると、cmdウィンドウが開き、同じバッチファイル内で実行するバージョンを尋ねるようにすることが可能かどうか疑問に思っていました。 – Frazier

関連する問題