簡単な方法は、バッチファイルを格納するディレクトリを作成することです。一般名はbatch
またはbelfry
で、ディレクトリ名はpath
変数に含めます。これにより、現在のディレクトリに関係なく、ディレクトリ内のバッチファイルが実行される可能性があります。
ああ - ところで:なぜあなたは自分の最初のバッチで
move "!filename1!" "!folder1!\!filename1:~0,11!!filename1:~-4!" >nul
を使用していませんか?
実行されるファイルになります、あなたが実行可能な(例えば
c:\some\directory\executable.exe
)へのパスを指定
。ただし、ディレクトリを省略して単にexecutable.exe
を実行すると、現在のディレクトリ内のファイルの検索が試行されます。これが失敗すると、環境変数path
が検査され、path
にある最初に一致する実行可能ファイルが実行されます。
したがって、あなたはあなたのpath
は、ディレクトリのようなc:\batch
executablename.exe
はc:\batch
ディレクトリに存在する場合、それを実行する実行可能ファイルを実行しようとする試みを含めるように変更した場合。
実行可能ファイルは、(そうfred
が.
のそれぞれにfred.bat
、fred.cmd
、fred.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
が必要です。
ファイル名を '_'文字ではなく文字の位置で分割する特別な理由はありますか?名前に複数の '_ 'があってもよいでしょうか? – aschipfl