あまり知られていないが、Windowsバッチファイルの重要で便利な機能にはどのようなものがありますか?
ガイドライン:
- 回答ごとに1つの機能
- ドキュメントへのリンクだけでなく、機能の簡単な説明と例の両方を提供してください
- ネイティブの機能への回答を制限します。つまり、Windowsリソースキットのような追加のソフトウェアを必要としません
明確化:ここでは、WinNTバリアントのデフォルトであるcmd.exeによって処理されるスクリプトを参照します。
あまり知られていないが、Windowsバッチファイルの重要で便利な機能にはどのようなものがありますか?
ガイドライン:
明確化:ここでは、WinNTバリアントのデフォルトであるcmd.exeによって処理されるスクリプトを参照します。
回答:
行の継続:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf
。そして、その行のすべてのパラメーターを理解するには、単にを実行しC:\WINDOWS\system32\ntbackup.exe /?
ます。
PUSHD path
pathで指定されたディレクトリに移動します。
POPD
「プッシュ」したディレクトリに戻ります。
これがバッチファイルでどれほど役立つかはわかりませんが、コマンドプロンプトで使用するのに非常に便利なコマンドです。
C:\some_directory> start .
これにより、「some_directory」フォルダーにWindowsエクスプローラーが開きます。
私はこれが素晴らしい時間の節約になると思いました。
open .
している場合も、同じことを行います。
start
現在のフォルダを開くだけではありません。任意のファイルを渡すことができ、構成されたビューアで開きます。URLを指定すると、デフォルトのブラウザーが開きます...
私は常に、各行にキーワードが付けられたコメントを読むのが難しいことに気づきました。
REM blah blah blah
読みやすい:
:: blah blah blah
rem
はドキュメント化されたキーワードであり::
、実装の詳細にすぎません。::
動作が停止することはほとんどありませんが、文書化されていない動作に依存しないことが一般的に推奨されます。
goto :
して、ラベルにジャンプすることもできます。 :-)
そしてgoto -)
また働くでしょう。
可変部分文字列:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
for %a in ...
)のローカル変数と組み合わせることができないことに注意してください。これらは環境変数のように終了パーセント記号を必要としないためです。まずそれらを(遅延展開を使用して)環境変数に割り当ててから、部分文字列を抽出する必要があります。
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から以下のスクリプトtest.batを実行すると\ long dir name \フォルダ、
@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\
テスト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
コマンドを実行して出力を処理できる(bashの '$()'のバッククォートのように)。
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
ファイル名にスペースがある場合は、これを使用します。
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
コマンドからのすべての出力を非表示にするには、> nul 2>&1にリダイレクトします。
たとえば、一部のコマンドラインプログラムでは、> nulにリダイレクトしても出力が表示されます。ただし、次の行のように出力をリダイレクトすると、すべての出力が抑制されます。
PSKILL NOTEPAD >nul 2>&1
taskkill
ます。
PAUSE
実行を停止し、次のプロンプトを表示します。
何かキーを押すと続行します 。。。
Windowsエクスプローラーでバッチをダブルクリックしてバッチを実行し、コマンドウィンドウのフラッシュだけではなく実際に出力を表示する場合に便利です。
echo.|batch-with-pause.bat
「任意のキー」を押すのと同じ効果があります...
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では削除されません。
整数演算:
> SET /A result=10/3 + 1
4
Unicodeテキストファイル(16ビット/文字)をASCII DOSファイル(8ビット/文字)にすばやく変換します。
C:\> type unicodeencoded.txt > dosencoded.txt
おまけとして、可能であれば、キャラクターは正しくマッピングされます。
ブロック構造の場合:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
%ERRORLEVEL%
とにかく疑似変数を使用すべきではありません。それif errorlevel <foo>
が目的です。そして、それは実際にそのようなブロックで機能します。
機能はそれほど多くありませんが、titleコマンドを使用すると、タスクバーで長いスクリプトのステータスを提供したり、ユーザーのフィードバックを強化したりすることができます。
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
便利なエディターがなく、バッチファイルを作成する必要がありますか?
copy con test.bat
コマンドを入力するだけで、Enterキーを押して改行します。Ctrl-ZとEnterキーを押してファイルを閉じます。
文字列の減算の例にdate
とtime
「YYYY-MM-DD HH:MM:SS.txt」という名前のファイルを取得します
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
までの16進値ですF
。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