Windowsバッチファイルのあまり知られていないが重要で便利な機能は何ですか?
ガイドライン:
明確化:ここでは、WinNTバリアントのデフォルトであるcmd.exeによって処理されるスクリプトを参照します。
(参照: Windowsバッチファイル:.bat vs .cmd? )
行の継続:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
PUSHD path
pathで指定されたディレクトリに移動します。
POPD
「プッシュ」したディレクトリに戻ります。
これがbatchファイルでどの程度役立つかはわかりませんが、コマンドプロンプトで使用すると非常に便利なコマンドです。
C:\some_directory> start .
これにより、「some_directory」フォルダーでWindowsエクスプローラーが開きます。
これはすばらしい時間の節約になりました。
私はいつも、各行のキーワードでマークされたコメントを読むのが難しいと感じています:
REM blah blah blah
読みやすい:
:: blah blah blah
可変部分文字列:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
FORコマンド !バッチファイルを書くのは嫌いですが、ありがたいです。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
myfile.txtの各行を解析し、セミコロンで始まる行を無視し、各行から2番目と3番目のトークンをfor本文に渡します。トークンはコンマやスペースで区切ります。 for bodyステートメントが%iを参照して2番目のトークンを取得し、%jが3番目のトークンを取得し、%kが3番目以降の残りのトークンをすべて取得することに注意してください。
これを使用して、ディレクトリ、ディレクトリの内容などを反復処理することもできます。
REMまたは::行でスクリプトを散らかすのではなく、各スクリプトの上部で次のことを行います。
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
パイプ文字とリダイレクト文字をエスケープせずに使用する方法に注意してください。
スクリプトが存在するパス(ドライブ付き):〜dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
%〜dp0の部分についてはすでに言及しましたが、実際にはさらに多くのことがあります。〜の後の文字は、抽出される情報を定義します。
パッチファイル名が返される文字はありません
d-ドライブ文字を返します
p-パスを返します
s-短いパスを返します
x-ファイル拡張子を返します
したがって、c:\ Temp\long dir name \フォルダから以下のスクリプトtest.batを実行すると、
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
次の出力が得られます
test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\
そして、次のようにパラメーターがスクリプトに渡される場合
test c:\ temp\mysrc\test.cpp
%1変数を使用して同じ操作を行うことができます。
ただし、%0の展開の結果は場所によって異なります!
バッチの「トップレベル」では、現在のバッチファイル名に展開されます。
関数(呼び出し)では、関数名に展開されます。
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
出力は次のとおりです(バッチファイルはmyBatch.batで開始されます)
myBatch.bat
:test
:test
myBatch
CALL、EXIT/B、SETLOCALおよびENDLOCALを使用すると、ローカル変数を使用してサブルーチンを実装できます。
例:
@echo off
set x=xxxxx
call :sub 10
echo %x%
exit /b
:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b
これは印刷されます
11
xxxxx
:subはxを変更しますが。
N秒待機する巧妙なトリック(cmd.exeの一部ではありませんが、Windowsに付属しているため追加のソフトウェアではありません)、ping行を参照してください。最初のpingが遅延なく送信されるため、N + 1のpingが必要です。
echo %time%
call :waitfor 5
echo %time%
goto :eof
:waitfor
setlocal
set /a "t = %1 + 1"
>nul ping 127.0.0.1 -n %t%
endlocal
goto :eof
「配管」のエスケープ:
echo ^| ^< ^> ^& ^\ ^^
コマンドを実行し、出力を処理できること(bashの '$()'のバックティックなど)。
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
ファイル名にスペースがある場合、これを使用します:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
空のファイルを作成する:
> copy nul filename.ext
コマンドからのすべての出力を非表示にするには、> nul 2>&1にリダイレクトします。
たとえば、一部のコマンドラインプログラムでは、> nulにリダイレクトしても出力が表示されます。ただし、次の行のように出力をリダイレクトすると、すべての出力が抑制されます。
PSKILL NOTEPAD >nul 2>&1
編集: コマンドの出力を無視する をご覧ください。
Bash(および他のシェル)に相当
echo -n Hello # or
echo Hello\\c
これは、末尾の改行なしで「Hello
」を出力します。これを行うcmdハック:
<nul set /p any-variable-name=Hello
set /p
は、ユーザーに入力を促す方法です。指定された文字列を出力し、ユーザーが応答を入力するのを(同じ行、つまりCRLFなしで)待機します。
<nul
は単純に空の応答をset /p
コマンドにパイプするため、最終的な結果は発行されたプロンプト文字列になります。 (使用される変数は、空の応答のために変更されません。)
問題は次のとおりです。先頭の等号を出力することはできません。Vistaでは先頭の空白文字が削除されますが、XPでは削除されません。
PAUSE
実行を停止し、次のプロンプトを表示します。
何かキーを押すと続行します 。 。 。
Windowsエクスプローラーでバッチをダブルクリックしてバッチを実行し、コマンドウィンドウをフラッシュするだけでなく、実際に出力を表示する場合に便利です。
環境変数を設定するときの検索と置換:
> @set fname=%date:/=%
...タイムスタンプ付きファイル名で使用するために、日付から「/」を削除します。
そしてサブストリングも...
> @set dayofweek=%fname:~0,3%
整数演算:
> SET /A result=10/3 + 1
4
コマンド区切り記号:
cls & dir
copy a b && echo Success
copy a b || echo Failure
2行目では、&&の後のコマンドは、最初のコマンドが成功した場合にのみ実行されます。
3行目の||の後のコマンド最初のコマンドが失敗した場合にのみ実行されます。
Ifステートメントを連鎖させて、短絡論理演算子「and」のような効果を得ることができます。
if foo if bar baz
空白行を出力します:
echo.
ブロック構造の場合:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
Unicodeテキストファイル(16ビット/文字)をASCII DOSファイル(8ビット/文字)にすばやく変換するには。
C:\> type unicodeencoded.txt > dosencoded.txt
ボーナスとして、可能であれば、キャラクターは正しくマッピングされます。
多くの機能は提供しませんが、タスクバーの長いスクリプトのステータスの提供、またはユーザーフィードバックの強化など、いくつかの用途にtitleコマンドを使用できます。
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
変数の遅延展開(適切な測定のためにサブストリングがスローされます):
@echo off
setlocal enableextensions enabledelayedexpansion
set full=/u01/users/pax
:loop1
if not "!full:~-1!" == "/" (
set full2=!full:~-1!!full2!
set full=!full:~,-1!
goto :loop1
)
echo !full!
endlocal
便利なエディターがなく、バッチファイルを作成する必要がありますか?
copy con test.bat
コマンドを入力するだけで、Enterを押して新しい行を入力します。 Ctrl-ZとEnterを押してファイルを閉じます。
「__YY_MM-DD HH:MM:SS.txt」という名前のファイルを取得するためのdate
およびtime
の文字列減算の例
echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"
color
を使用して、スクリプトが正常に終了したか、失敗したか、またはテキストと背景の色を変更して入力が必要かどうかを示します。視界に手が届くが、かなり離れた場所にあるマシンがある場合に非常に役立ちます
色XY
ここで、XとYは0
からF
までの16進値です。ここで、X-背景、Y-テキスト、X = Y色は変更されません。
カラーZ
テキストの色を「Z」に変更し、黒の背景を設定します。「色0」は機能しません
色の名前の呼び出し
色 ?
スペースとエスケープ文字を使用した出力の完全な制御:
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
TheSoftwareJediは既にforコマンドについて言及しましたが、非常に強力なので再度言及します。
以下は、YYYYMMDD形式で現在の日付を出力します。バックアップ用のディレクトリを生成するときにこれを使用します。
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
Callを使用して後で名前を評価し、いくつかの有用なプロパティに導くことができます。
call set SomeEnvVariable_%extension%=%%%somevalue%%%
Callを使用して、名前が他の変数に依存する変数を設定します。いくつかの変数命名規則を使用する場合、注意深い命名規則を使用して、配列や辞書などのデータコレクションをエミュレートできます。 somevalueの周りのトリプル%は、呼び出しの後、setが呼び出される前に、単一の%で囲まれた1つの変数名に評価されます。これは、2つの%が連続して1つの%文字にエスケープすることを意味し、その後再び展開するため、somevalueは事実上名前ポインターです。
call set TempVar=%%SomeEnvVariable_%extension%%%
これを一時変数で使用して値を取得し、ロジックで使用できます。これは、遅延変数展開と組み合わせて使用する場合に最も役立ちます。
この方法を適切に使用するには、遅延変数の展開を有効にする必要があります。デフォルトではオフになっているため、これを最初の指示の1つとして、スクリプト内で有効にするのが最善です。
setlocal EnableDelayedExpansion
パス(または必要に応じて他のパスのような文字列)で実行可能ファイルを検索します。
c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe
c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe
c:\>
コメントにREM
の代わりに::
を使用することに関して:注意してください! ::
は、コメントのように動作するCALLラベルの特殊なケースです。たとえば、FORループやIFループで角かっこ内で使用すると、関数は途中で終了します。デバッグするのは非常にイライラする!
完全な説明については、 http://www.ss64.com/nt/rem.html を参照してください。
( 上記の最初の言及)へのコメントの代わりに新しい回答として追加 私はまだ通う価値がないので:0:0)
ENDLOCALが使用する行のローカル変数は引き続き解析されます。これにより、次のようなトリックが可能になります。
ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%
これは、呼び出しコンテキストに結果を送信する便利な方法です。具体的には、ENDLOCALが完了するとすぐに%SOMELOCAL%が範囲外になりますが、それまでに%SOMELOCAL%は既に展開されているため、MYGLOBALはローカル変数を使用して呼び出しコンテキストに割り当てられます。
同じ理由で、あなたがすることに決めた場合:
ENDLOCAL & SET MYLOCAL=%MYLOCAL%
新しいMYLOCAL変数は、実際には、意図したローカライズされた変数ではなく、通常の環境変数として存在していることがわかります。
最近では多くの人がGOTO:EOFを使用してバッチファイルを終了していますが、この目的でEXIT/Bを使用することもできます。
EXIT/Bを使用することの利点は、EXIT/Bの後にエラーレベルを追加でき、そのエラーレベルで終了することです。
Cmd.exeのクイック編集モードは私のお気に入りです。これは少しトピックから外れていますが、コマンドシェルと対話するときに、命の恩人になる可能性があります。いいえ、私は双曲的ではありません-caret-capitol-v死ぬまでに一定の回数しか表示されません。見れば見るほど死にます。
(これはUIからも設定できます。これがおそらくより良い方法です。手順についてはコメントを参照してください。また、これを行うニースの1行スクリプトもあります。)
コピーするには、左クリックしてドラッグして選択し、右クリックしてコピーします。貼り付けるには、右クリックします。
もうない^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V !!!
クラップ、私は誰かを殺したと思う。ごめんなさい!
呼び出しセット-環境変数を数レベル深く展開します。
これは http://ss64.com/nt/call.html#advanced 別のSO質問への回答から forループで初期化されたバッチファイル変数
set VarName=Param
set Param=This
call set Answer=%%%Varname%%%
Echo %Answer%
与える
set VarName=Param
set Param=This
call set Answer=%Param%
Echo This
This
サブルーチン(出力42):
@echo off
call :answer 42
goto :eof
:do_something
echo %1
goto :eof
値を返すサブルーチン(出力0、1、2など):
@echo off
setlocal enableextensions enabledelayedexpansion
call :seq_init seq1
:loop1
if not %seq1%== 10 (
call :seq_next seq1
echo !seq1!
goto :loop1
)
endlocal
goto :eof
:seq_init
set /a "%1 = -1"
goto :eof
:seq_next
set /a "seq_next_tmp1 = %1"
set /a "%1 = %seq_next_tmp1% + 1"
set seq_next_tmp1=
goto :eof
「ディレクトリの削除」のサブディレクトリオプション:
rd /s /q junk
バッチの出力が既に> con
構文を介してファイルにリダイレクトされている場合でも、出力をコンソールにリダイレクトします。
例:foo.cmd:
echo a
echo b > con
呼び出し:
foo.cmd > output.txt
これにより、"a"
がoutput.txt
になり、さらに"b"
がコンソールになります。
SHIFT
これは、コマンドラインでスクリプト(またはサブルーチン)に渡される可変数の引数を反復処理する方法です。最も単純な使用法では、%2を%1に、%3を%2に、などにシフトします。 (複数の引数をスキップするためにSHIFTにパラメーターを渡すこともできます。)これにより、コマンドは「破壊的」になります(つまり、%1は永久になくなります)が、サポートされる引数の最大数をハードコーディングすることを回避できます。
コマンドライン引数を1つずつ処理する簡単な例を次に示します。
:ParseArgs
if "%1"=="" (
goto :DoneParsingArgs
)
rem ... do something with %1 ...
shift
goto :ParseArgs
:DoneParsingArgs
rem ...
Errorlevelを使用して、バッチファイルを実行するシステム(現在のディレクトリまたはパス)で特定のプログラムが利用可能かどうかを確認できます。これが機能するためには、テスト対象のプログラムを実行し、終了し、実行時に終了コードを設定する必要があります。私が使用する例では-? myExeの引数として、ほとんどのCLIプログラムには-h、-help、-vなどの同様の引数があります...
myExe -? >nul 2>&1
Set errCode=%errorlevel%
@if %errCode% EQU 0 (
echo myExe -? does not return an error (exists)
) ELSE (
echo myExe -? returns an error (does not exist)
)
はい、errCodeに割り当てるのではなく、直接エラーレベルをテストできますが、この方法では、テストと条件の間にコマンドを配置し、必要に応じて条件を繰り返しテストできます。
現在の日、月、年を取得します(ロケールに依存しません):
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date
:set_date
if ("%1:~0,1%" gtr "9") shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof
:end_set_date
echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%
数値変数を持つループの正しい形式は
for /l %%i in (startNumber, counter, endNumber) do echo %%i
CHOICE コマンドは、複数のオプションのいずれかをユーザーに要求します(1回のキー入力を介して)
@echo off
echo Please choose one of the following options
echo 1. Apple
echo 2. Orange
echo 3. Pizza
echo a, b, c. Something else
choice /c:123abc /m "Answer?"
set ChoiceLevel=%ErrorLevel%
echo Choice was: %ChoiceLevel%
%ChoiceLevel%
が選択されたn番目のオプションになります(上記の例では、b=5
)。
ブランチ間でファイルをコピーする場合の便利なトリック:
C:\src\branch1\mydir\mydir2\mydir3\mydir4>xcopy %cd:branch1=branch2%\foo*
Overwrite C:\src\branch1\mydir\mydir2\mydir3\mydir4\foo.txt (Yes/No/All)? y
C:\src\branch2\mydir\mydir2\mydir3\mydir4\foo.txt
これは、%cd%環境変数と環境変数置換の両方を使用します。
スクリプト内からstdinを解析するには、FORコマンドとFINDコマンドを使用したトリックが必要です。
for /f "tokens=*" %%g in ('find /V ""') do (
:: do what you want with %%g
echo %%g
)
バッチファイル内の配列。
値を設定します。
set count=1
set var%count%=42
コマンドラインで値を抽出します。
call echo %var%count%%
バッチファイルの値を抽出します。
call echo %%var%count%%%
追加のストラフティング%記号に注意してください。
テクニックは少し毛深いように見えるかもしれませんが、それは非常に便利です。上記は、説明したようにvar1(つまり42)の内容を出力します。他の変数をvar1の値に設定する場合は、echoコマンドをsetに置き換えることもできます。次の意味は、コマンドラインでの有効な割り当てです。
call set x=%var%count%%
次に、va1の値を確認するには:
echo %x%
/ c cmd.exe自体のparamは、これらのコマンドを実行してから実行するように指示します。
私は自分が頻繁にやっていることに気付いていました
win + r、 cmd 戻る、 ping google.com 戻る
しかし、今私はちょうど:
win + r、 cmd/c ping google.com 戻る
はるかに高速。また、pstoolsを使用していて、psexecを使用してリモートマシンでコマンドライン機能を実行する場合にも役立ちます。
編集:/ k 同じように機能しますが、プロンプトは開いたままにします。これは、より頻繁に役立つ場合があります。
forfiles は、たとえば、2日以上経過したすべてのファイルを再帰的に削除する場合に非常に便利です。
forfiles /D -2 /P "C:\Temp" /S /C "cmd /c del @path"
価値のあることについては、 this はWindows CMDまたはバッチファイルの非常に優れたオンラインリファレンスです。知らないことをいくつか学びました。
Doskeyマクロ。
私はこれに対する参照を長い間失いましたが、それはまだ良い考えであり、共有する価値があると思います。
バッチファイルとdoskeyスクリプトを単一のファイルにマージできます。これは少し過度に賢いように思えるかもしれませんが、機能します。
;= @echo off
;= rem Call DOSKEY and use this file as the macrofile
;= %SystemRoot%\system32\doskey /listsize=1000 /macrofile=%0%
;= rem In batch mode, jump to the end of the file
;= goto end
;= Doskey aliases
h=doskey /history
;= File listing enhancements
ls=dir /x $*
;= Directory navigation
up=cd ..
pd=pushd
;= :end
;= rem ******************************************************************
;= rem * EOF - Don't remove the following line. It clears out the ';'
;= rem * macro. Were using it because there is no support for comments
;= rem * in a DOSKEY macro file.
;= rem ******************************************************************
;=
偽のドスキーマクロ「;」を定義することで機能しますバッチファイルとして解釈される場合は、優雅に(または静かに)無視されます。
ここにリストされているバージョンを短縮しました。さらに必要な場合は、 here に進みます。
PushdをUNCパスに使用すると、一時的なドライブマッピングが作成され(Zから始まり、次の使用可能な文字を見つけるために後方に移動)、そのドライブとパスに移動します。コマンドプロンプトをポップまたは終了すると、一時的なマッピングはなくなります。
C:\>pushd \\yourmom\jukebox
Z:\>pushd \\yourmom\business
Y:\>
また、コマンドライン環境のヒントほどではありませんが、pushdとpopdおよびネットワーク共有を使用してコマンドラインで作業している場合、プロンプトを$ +(pushdスタックの深さを表示)で変更すると便利です。 $ M(ネットワーク共有パスを表示)。
C:\utils>Prompt $+$m$p$g
C:\utils>pushd m:
+\\yourmom\pub M:\>pushd c:\
++c:\>pushd
M:\
C:\utils
++c:\>popd
+\\yourmom\pub M:\>popd
C:\utils>
コマンドの出力をファイルにリダイレクトできるのは非常に便利です。
DIR *.txt > tmp.txt
DIR *.exe >> tmp.txt
一重矢印はファイルを作成または上書きし、二重矢印はファイルに追加します。これで、テキストエディターでtmp.txtを開いて、あらゆる種類の機能を実行できます。
正規表現をサポートするFindstr:
findstr "^[0-9].*" c:\windows\system32\drivers\etc\hosts
パイプ「|」を使用して、フォルダー内のファイル内の文字列を検索しますコマンド:
dir /b *.* | findstr /f:/ "thepattern"
&::
を使用したコメントのインライン化。
:: This is my batch file which does stuff.
copy thisstuff thatstuff &:: We need to make a backup in case we screw up!
:: ... do lots of other stuff
これはどのように作動しますか?いハックです。 &
は、UNIXシェルの;
をほぼ近似するコマンド区切り文字です。 ::
は、REM
ステートメントをエミュレートするちょっとした厄介なハックです。最終結果は、コマンドを実行してから何もしないコマンドを実行することで、コメントを近似します。
これはすべての状況で機能するわけではありませんが、便利なハックとして十分な頻度で機能します。
すべてのドライブをリストします。
fsutil fsinfo drives
SET /P
を使用してファイルから環境変数を設定する
SET /P SVNVERSION=<ver.tmp
「%」ディレクティブを指定しなくても、環境変数に基づいてディレクトリを変更できます。指定された変数が存在しない場合は、ディレクトリ名を試してください。
@if defined %1 (call cd "%%%1%%") else (call cd %1)
コピーを使用してファイルを追加します。
copy file1.txt+file2.txt+file3.txt append.txt
また、すべてのCLIパラメーターを単一の変数に設定するには:
SET MSG=%*
これは、スペースで区切られたすべてのWord(またはシンボル)を取得し、単一のバッチファイル変数に保存します。技術的には、各パラメーターは%1、%2、$ 3などですが、このSETコマンドはワイルドカードを使用してstdinのすべてのパラメーターを参照します。
バッチファイル:
@SET MSG=%*
@echo %MSG%
コマンドライン:
C:\test>test.bat Hello World!
Hello World!
新しいファイルを作成して編集を開始する
copy con new.txt
This is the contents of my file
^Z
Ctrl + Zは、ASCII EOF文字を送信します。これは、bashのheredocsのようなものです。
cat <<EOF > new.txt
This is the contents of my file
EOF
シンボリックリンク:
mklink /d directorylink ..\realdirectory
mklink filelink realfile
このコマンドは、VistaやWindows 7など、Windows Server 2008以降にネイティブです(一部のWindowsリソースキットにも含まれています)。
ディレクトリツリー内の文字列を再帰的に検索します。
findstr /S /C:"string literal" *.*
正規表現も使用できます。
findstr /S /R "^ERROR" *.log
再帰的なファイル検索:
dir /S myfile.txt
Goto:eofペーストボード
コードフラグメント用の便利なスペースとして、スクリプトの最後に「goto:eof」を追加します。そうすれば、コメントしたりコメントを外したりせずに、このエリアとの間ですばやくコピー/貼り付けを行うことができます。
goto :eof
:: code scraps
call this.bat
call that.bat
set TS=%DATE:~10%%DATE:~4,2%%DATE:~7,2%-%TIME:~0,2%%TIME:~3,2%%TIME:~6%%
for /R C:\temp\ %%G in (*.bak) DO del %%G
エラー時に保釈します。
IF "%errorlevel%" NEQ "0" (
echo "ERROR: Something broke. Bailing out."
exit /B 1
)
上記と同様に、CALL、EXIT/B、SETLOCALおよびENDLOCALを使用して、ローカル変数と戻り値を使用して関数を実装できます。
例:
@echo off
set x=xxxxx
call :fun 10
echo "%x%"
echo "%y%"
exit /b
:fun
setlocal
set /a y=%1 + 1
endlocal & set x=%y%
exit /b
これは印刷されます:
"11"
""
Y変数がローカルスコープを離れることはありませんが、CMDが一度に1行を解決する方法のため、親スコープのx変数に値を抽出できます。
1行に複数のコマンドがあり、多くの状況で役立ちます。
&2つのコマンドを組み合わせて使用し、command1を実行してからcommand2を実行します
&&条件付き組み合わせ。command1が正常に完了した場合、command2を実行します
¦¦ Command2は、command1が正常に完了しない場合にのみ実行されます。
例:
:: ** Edit the most recent .TXT file and exit, useful in a .CMD / .BAT **
FOR /F %%I IN ('DIR *.TXT /B /O:-N') DO NOTEPAD %%I & EXIT
:: ** If exist any .TXT file, display the list in NOTEPAD, if not it
:: ** exits without any error (note the && and the 2> error redirection)
DIR *.TXT > TXT.LST 2> NUL && NOTEPAD TXT.LST
エラーレベルを任意の数値に設定する方法:
CMD/C EXIT番号
対話型バッチスクリプトの入力を非表示にします。
@echo off
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>in.com
set /p secret_password="Enter password:"<nul
for /f "tokens=*" %%i in ('in.com') do (set secret_password=%%i)
del in.com
DEBUG.EXEはバッチファイルの非常に有用で非常に十分に使用されていない機能だと思います。
DEBUGコマンドを使用すると、次のことができます...
要するに、このツールは非常に強力です。最近ではあまり使用されていないかもしれませんが、バッチスクリプトからこの機能を呼び出して制御する力により、バッチスクリプトに驚異的な量の力が追加されます。
注:MicrosoftはこのコマンドをWindows XPおよびVistaの64ビットエディションから削除し、私が聞いたことからWindows 7から完全に削除する予定です。
周囲の引用符を削除します。
for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a
最近、VS prebuildイベントによって呼び出されるバッチファイルを作成する必要があり、プロジェクトディレクトリにパラメーターとして渡したいと思います。バッチファイルでは、パスとネストされたサブフォルダー名を連結する必要がありますが、最初に周囲の引用符を削除する必要があります。
ここで、指定されたディレクトリをスキャンしてCLASSPATHを構築する方法。
setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is %CLASSPATH%
XP(またはそれ以上)で動作します。 W2Kでは、いくつかのBATファイルを使用して同じ結果を得る必要があります( クラスパス定義にすべてのjarを含める を参照)。
CLASSPATHでワイルドカードを直接指定できるため、1.6では不要です(例:-cp "。\ lib *")。
HELP
異なるOSバージョンを使用する場合、ネイティブで使用可能なコマンドを知ることが重要です。コマンドプロンプトでHELPと入力すると、使用可能なコマンドとその機能の簡単な説明が表示されます。
cmd.exe /?
これにより、コマンドプロンプトを起動するためのすべてのコマンドラインパラメーターと、システム全体の動作を変更するレジストリ調整が一覧表示されます。
数値カウンターを使用したループの場合(出力1〜10):
for /l %i in (1,1,10) do echo %i
実行中にバッチファイルを変更できます。たとえば、バッチファイルを終了する前に結果を確認したい場合は、実行中に忘れたpause
をファイルの末尾に追加できます。
実行中のバッチファイルの変更 を参照してください
私は個人的に、これを機能というよりも落とし穴だと考えています。
このバッチファイルは、コマンドラインパラメータとしてbothとシンプルなfilesおよびdirectoriesで機能します(任意の順序で混合できます)。ループは、指定されたファイルに対してコマンド(この例では「エコー」)を実行します。パラメーターがディレクトリの場合、そのファイル内の各ファイルに対してコマンドを再帰的に実行します。
@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f
ログファイルなどに使用する現在の日付/時刻を取得するには、バッチファイルでこれを使用します。
for /f "usebackq tokens=1,2,3,4,5,6,7 delims=/:. " %%a in (`echo %DATE% %TIME%`) do set NOW=%%d%%b%%c_%%e%%f%%g
set LOG=output_%NOW%.log
IFコマンド!それなしでは、バッチファイルはジャンクでした!
@echo off
IF exist %windir%\system32\iexplore.exe goto end
echo Hmm... it seems you do not have Internet Explorer.
echo Great! You seem to understand ;)
:end
echo Hmm... You have Internet Explorer.
echo That is bad :)
grepの代わりとしてのFIND
。
findを使用して自分用に小さな「電話帳」をハッキングしました。非常に便利:
@echo off
:begin
set /p term=Enter query:
type phonebookfile.txt |find /i "%term%"
if %errorlevel% == 0 GOTO :choose
echo No entry found
set /p new_entry=Add new entry:
echo %new_entry% >> phonebookfile.txt
:choose
set /p action=(q)uit, (n)ew query or (e)dit? [q]
if "%action%"=="n" GOTO anfang
if "%action%"=="e" (
notepad phonebookfile.txt
goto :choose
)
非常に高速で効果的です。
行ベースの実行
ほとんどの場合、明確な利点ではありませんが、実行中に更新を試みるときに役立ちます。例えば:
UpdateSource.bat
copy UpdateSource.bat Current.bat
echo "Hi!"
Current.bat
copy UpdateSource.bat Current.bat
現在、Current.batを実行するとこの出力が生成されます。
HI!
ウォッチアウトただし、バッチ実行は行番号で進行します。このような更新では、重要な行の行番号がまったく同じでない場合、行をスキップまたは元に戻す可能性があります。
スクリプトでcommand extensionsシェルオプションを使用する場合、スクリプトの冒頭で次のトリックを行うことを強くお勧めします。
-から貼り付けられた情報 http://www.ss64.com/nt/setlocal.html
引数を指定すると、SETLOCALはERRORLEVELを設定します。 2つの有効な引数のいずれかが指定されている場合はゼロになり、それ以外の場合は1になります。
次の手法を使用して、バッチファイルでこれを使用して、コマンド拡張機能が利用可能かどうかを判断できます。
VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions
これは、「VERIFYエラー」がERRORLEVELを1に設定し、拡張機能が利用できない場合(たとえば、スクリプトがcommand.comで実行されている場合)、SETLOCALがERRORLEVEL値のリセットに失敗するためです。
コマンド拡張機能が永続的に無効になっている場合、SETLOCAL ENABLEEXTENSIONSはそれらを復元しません。
私はこれが本当に好きです Windows XPコマンド リファレンス、および 構文 上部のリンク;他の回答で既に見つかった多くのヒントとコツをカバーしています。
不明な数のパラメーターをバッチファイルに渡すとき、たとえば複数のファイルを起動してバッチファイルにドラッグアンドドロップすると、各パラメーター変数を名前で参照できます。
TYPE %1
TYPE %2
TYPE %3
TYPE %4
TYPE %5
...etc
ただし、各パラメーターが存在するかどうかを確認する場合、これは非常に面倒です。
if [%1] NEQ [] (
TYPE %1
)
if [%2] NEQ [] (
TYPE %2
)
if [%3] NEQ [] (
TYPE %3
)
if [%4] NEQ [] (
TYPE %4
)
if [%5] NEQ [] (
TYPE %5
)
...etc
また、このアプローチでは、限られた数のパラメーターのみを受け入れることができます。
代わりに、SHIFTコマンドを使用してみてください。
:loop
IF [%1] NEQ [] (
TYPE %1
) ELSE (
GOTO end
)
SHIFT
GOTO loop
:end
SHIFTはすべてのパラメーターを1つ下に移動するため、%2は%1になり、%3は%2になります。
一般的に使用されるディレクトリへのクイックショートカットとして使用します。 PATHのディレクトリにある「sandbox.bat」という名前のサンプルファイル
Explorer "C:\Documents and Settings\myusername\Desktop\sandbox"
スクリプトの呼び出しは、WIN + R->サンドボックスだけです
環境変数の合計サイズを取得する非常に古い(1990年頃)トリック:
set > test
dir test
del test
これは、バッチファイルを何度もクリックすることなく、My Nant Buildスクリプトを連続して実行するために使用する1つのトリックです。
:CODELINE
NANT.EXE -buildfile:alltargets.build -l:build.log build.product
@pause
GOTO :CODELINE
ソリューションの構築が完了すると、ソリューションは一時停止します。そして、いずれかのキーを押すと、ビルドスクリプトが再実行されます。とても便利です。
EDLINコマンドもあります。かつて行ベースのテキスト編集に使用されていた古いろくでなしツールかもしれませんが、コマンドラインから制御できるという事実は、主にEDLINを使用する他の場合と同様に、バッチスクリプトにかなり便利です利用可能な唯一のツール。結局のところ、EDLINは、多少自虐的でない限り、通常テキスト編集に使用したいツールではありません。ティム・パターソン(それを書いたフェロー)を引用すると:「IBMがそれを使用していて、窓の外に捨てていないことを聞いたとき、私は驚きました。」
注:EDLINは、編集するファイルに旧式のEOF(1A)マーカーを追加します。それらを削除する必要がある場合は、おそらくDEBUGを使用する必要があります。