Windowsバッチファイルの非表示機能


232

あまり知られていないが、Windowsバッチファイルの重要で便利な機能にはどのようなものがありますか?

ガイドライン:

  • 回答ごとに1つの機能
  • ドキュメントへのリンクだけでなく、機能の簡単な説明例の両方を提供してください
  • ネイティブの機能への回答を制限します。つまり、Windowsリソースキットのような追加のソフトウェアを必要としません

明確化:ここでは、WinNTバリアントのデフォルトであるcmd.exeによって処理されるスクリプトを参照します。

(参照:Windowsバッチファイル:.bat vs .cmd?

回答:


185

行の継続:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

2
先週これを探していました!(キャラクターを思い出せませんでした)
chilltemp '11

21
^は実際には引用文字です。これを使用すると、出力をリダイレクトしないように<と>を引用できます。行末の^も行の継続を許可します。
Cheeso 09

この小さなスクリプトレットについて説明していただけますか?
-guerda

2
@furtelwart:これは、すべてを1行に書き込んだ場合と同じです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 /?ます。
カートファイフル2010

このトピックに関する詳細な議論、長いコマンドが複数行に分かれている
jeb

150
PUSHD path

pathで指定されたディレクトリに移動します

POPD

「プッシュ」したディレクトリに戻ります。


5
これは完全なスタックとしても機能するので、スタックに多くのディレクトリをプッシュし、ポップを続けると元の場所に戻ることができます。
Kibbee 08年

マジ?この機能について聞いたことがありませんか?!
Josh Hinman、

4
「cmd.exe」を実行してから「help」と入力し、次に「help pushd」または「pushd /?」と入力します。
paxdiablo 2008年

86
UNCパスにプッシュすると、ドライブが自動的にマップされ、popdがそれをマップ解除します。
Ferruccio

2
特にUNC機能では、+ 1を回答に追加する必要があります。
Adam Mitz、

109

これがバッチファイルでどれほど役立つかはわかりませんが、コマンドプロンプトで使用するのに非常に便利なコマンドです。

C:\some_directory> start .

これにより、「some_directory」フォルダーにWindowsエクスプローラーが開きます。

私はこれが素晴らしい時間の節約になると思いました。


1
まあ、私もそれを使用しています。PATHディレクトリの1つに「open.cmd」ファイルがあり、そのファイル内の唯一のものは「@start」です。;)
パウリウス

5
'explorer'も 'start' C:\ some_directory> explorerと同じことを行います。
レイ

1
これを[start ""とタイプする傾向があります。](わかりやすくするための括弧)開始は、最初のパラメータがタイトルであることについて、時々厄介です。
システムの一時停止

1
Macを使用open .している場合も、同じことを行います。
Grant Paul

1
start現在のフォルダを開くだけではありません。任意のファイルを渡すことができ、構成されたビューアで開きます。URLを指定すると、デフォルトのブラウザーが開きます...
idbrii

87

私は常に、各行にキーワードが付けられたコメントを読むのが難しいことに気づきました。

REM blah blah blah

読みやすい:

:: blah blah blah

8
REMはREMよりも効率的であると聞きました。REMはその後に発生するものに対して環境変数の拡張を試みますが、::はそうではないためです。
スコットランガム、

47
実際、::はおかしな名前のラベルにすぎません。そのため、ブロック内(括弧内)で使用すると、::は機能しません。ラベルも使用できないためです。REMはもちろんそこで機能します。
mihi

ただし、これremはドキュメント化されたキーワードであり::、実装の詳細にすぎません。::動作が停止することはほとんどありませんが、文書化されていない動作に依存しないことが一般的に推奨されます。
ジョーイ

を使用goto :して、ラベルにジャンプすることもできます。 :-)そしてgoto -)また働くでしょう。
Sven Marnach

79

可変部分文字列:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456

3
醜いが、とても便利!
guerda

1
@furtelwartはそのようなモットーかもしれません
rzrgenesys187

これは日付の書式設定に最適です(ただし、私が見つけた問題は、vista / 7とxpが異なる方法でDATEを出力したことです)
Daniel

残念ながら、これはFORループ(for %a in ...)のローカル変数と組み合わせることができないことに注意してください。これらは環境変数のように終了パーセント記号を必要としないためです。まずそれらを(遅延展開を使用して)環境変数に割り当ててから、部分文字列を抽出する必要があります。
RolKau 2011年

これは、日付(バックアップファイル名など)で何かを実行したい場合、避けられない醜い方法です。Windowsコマンドラインの一般的な醜さを目にした後、Windowsがほとんどポイントアンドクリックである理由がわかります:)新しいPowerShellの方が優れていると言われていますが。
HalilÖzgür12年

72

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番目以降の残りのすべてのトークンを取得することに注意してください。

これを使用して、ディレクトリ、ディレクトリの内容などを反復することもできます。


4
バッチファイルのFORループが制限されており、書くのがひどいことに気づきましたが、それらは時々役に立ちます。
ya23 2008

2
すみませんが、これはいったいどのように活用されているのでしょうか。FORループがわからなければ、バッチスクリプトもわからないと思います。
スタイルを使用したコーディング

11
使い古されていてもいなくても、拷問です。(いくつかは必要悪を主張するだろう。)
ハーポ

私はそれを数回使用する必要があり、この構文を作成した人は解雇されるべきです。大砲から。太陽に。それは悪いです。
VitalyB 2011年

1
@CodingWithStyle:バッチファイルにforループを記述する必要があるたびに、スクリプトはbashランチャーになり、代わりにbash(またはpython)でスクリプトを書き換えます:)
idbrii

60

REMまたは::行でスクリプトを散らかすのではなく、各スクリプトの先頭で次のようにします。

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

パイプ文字とリダイレクト文字をエスケープせずに使用する方法に注意してください。


3
%1の "/?"をチェックすると、さらに冷たくなるでしょう。そして、そのセクションをヘルプテキストとしてエコーできます。
demoncodemonkey 2009

6
うーん、読み書きのバッチプログラミング?!
Muhammad Alkarouri、

54

スクリプトがあるパス(ドライブを含む):〜dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%

通常は%CD%を使用します。多分それはすべてのDOSシェルバージョンで利用できるわけではありませんか?
ソールドルギン

11
%CD%は現在のディレクトリで、%〜dp0は実行中のスクリプトが配置されているディレクトリです。
RealHowTo 2008年

また、%CD%は以前は存在していなかったと思います... XP、おそらく。古いバージョンのWindowsにはないものがあることは知っています。
トーマスオーエンス

1
バットが別のドライブにある場合は、代わりにcd / d%BAT_HOME%を使用する必要があります。私が正しく覚えていれば、これは古いDOSでは機能しません。
ketorin 2010

ネットワークパスでバッチを実行する場合、cdまたはpushd%BATH_HOME%は機能しません。
Benoit

49

%〜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

43

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を変更します。


6
exit / bの代わりにgoto:eofを使用する必要があります。これは同じことを行いますが、より標準的な方法です。
Philibert Perusse 2008年

2
これには標準がありますか?O_o
パウリウス

3
私の間違い。:eofラベルを明示的に定義し、それに移動することを意味していると思いました。すべてのバッチファイルの末尾に暗黙の:eofラベルがあることに気づきませんでした。
Ferruccio

3
ただし、サブルーチンでエラーレベルを設定する場合は、exit / bを使用する必要があります。例:exit / b 3
Chris Noe

6
"goto:eof"の代わりに "exit / B"を使用してサブルーチンから戻るのが最善です。 "goto:eof"には、飲み込んだときにエラーコードが返されるという問題があります。たとえば、「もしsomeFile echo it's here」を使用した場合、someFileが存在しない場合にエラーレベルが設定されますが、これは問題ではなく、返したいエラーコードではありません(これは「 goto:eof "が行います)。
スコットランガム

42

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

2
さらに、これをsleep.batのようなファイルに入れて、何度も書き換える手間を省くことができます。
erjiang 2009年

1
... sleep.batをPATH環境変数のいくつかのディレクトリに配置します
Scoregraphic

私はこれを外に置くことに反対し、移植性を低くしています... Windowsシステム全体で。
ソリン

37

「配管」の回避:

echo ^| ^< ^> ^& ^\ ^^

3
DOSエスケープ文字はよく知られていないに違いない。いいね。
ジョシュア

12
ああ、それが行継続演算子でもある理由を説明しています
-bashの

@leander:すべてのCRを前に削除されているので、はい、それだけで、LF(とないCR)を逃れることができます
ジェブ

だから、これは以前は(コミットに対して差分にWindows上でのGitを使用する理由であるHEAD^)問題があります。
Daniel Trebbien

31

コマンドを実行して出力を処理できる(bashの '$()'のバッククォートのように)。

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

ファイル名にスペースがある場合は、これを使用します。

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i

2
名前にスペースが含まれているファイル名では機能しません...これは機能します:for / f "tokens = *"%i in( 'dir / on / b * .jpg')do echo-^>%i
doekman 2008

良いキャッチ。個人的には、ファイル名のスペースは地獄の9番目の円の奥から見ると邪悪で恐ろしいものだと思います。しかし、私たちは彼らに応えるべきだと思います。
paxdiablo 2008

それは私が今まで見た中で最もクレイジーな構文です。このbacktick.batを作成して文字列を渡すと機能しますか?
idbrii 2011年

30

空のファイルを作成する:

> copy nul filename.ext

6
@devio:エコー。空の行を置きます。したがって、ファイルは空になりません!
Paulius

4
type nul > filename.extそのために使用します。
Benoit

長い間、同等のタッチがあったのかと思いました。
jdelator 2011年

私はいつも使用していますren > blah.txt
Synetech

28

コマンドからのすべての出力を非表示にするには、> nul 2>&1にリダイレクトします。

たとえば、一部のコマンドラインプログラムでは、> nulにリダイレクトしても出力が表示されます。ただし、次の行のように出力をリダイレクトすると、すべての出力が抑制されます。

PSKILL NOTEPAD >nul 2>&1

編集:これがどのように機能するかの説明については、コマンドの出力無視するを参照してください。


1
これがどのように機能するか知っていますか?2>&1ビットの意味は何ですか?
スコットランガム

12
> nulはSTDOUTをnulにリダイレクトします。2>&1はSTDERRをSTDOUTが指している場所にリダイレクトします。
失神2008

具体的には、2>&1はSTDERRをSTDOUTのクローンに設定する「ファイルハンドルクローン」だと思います。> DULをリダイレクトする前ではなく、リダイレクトしたにクローンを作成するため、> NULの後に置くことが重要です。(私はここで間違っているなら、私を修正してください。)
リアンダー

1
PSKILLがどこから来るのか疑問に思う方は、sysinternals.comをチェックしてください。Proエディションを使用している場合は、ほぼ同じネイティブTSKILLコマンドが必要です。
スタイルのコーディング

1
pskillまたはtskillがない場合、私が使用したほとんどのWindowsシステムにはが付属していtaskkillます。
idbrii

25
PAUSE

実行を停止し、次のプロンプトを表示します。

何かキーを押すと続行します 。。。

Windowsエクスプローラーでバッチをダブルクリックしてバッチを実行し、コマンドウィンドウのフラッシュだけではなく実際に出力を表示する場合に便利です。


私が書くすべてのスクリプトの最後にタグを付けているので、これを「十分に活用されていない」とは言いがたい。また、IDEでスクリプトを実行して出力をキャプチャする場合、IDEには通常Enterキーを押す方法がないため、うまく機能しません...
Nicholas Flynt

15
「一時停止」の一つの巧妙な機能は...(あなたのバッチファイルは、システムサービスから実行されている場合など)、「任意のキー」を受信するには、no、端末の周りにはありませんならば、それはこれを検出し、ちょうどいっているということです
リアンダー

4
チャーリーソマービルへの+1。これは、90年代初頭にすべてのゲームプログラマーの「go.bat」が使用したことでよく知られています。
LiraNuna

6
すべてのバッチファイルを汚染する(そしてそれらをCLIオタクに使用するのを煩わしくする)代わりに、スタート/実行/を使用してから、「cmd / k」とバッチファイル名を入力します。または、HKCR \ batfile \ shell \ open \ commandのデフォルトの文字列を「cmd / k "%1"%*」に変更します。または、「@ cmd / k $ *」を実行するだけの別のバッチファイルを作成し、デスクトップに配置して、他のバッチファイルをドロップします。PAUSEの代替手段はたくさんあります。ご検討ください。
システムの一時停止

1
@gnud:引き続きスクリプトにパイプすることができます。echo.|batch-with-pause.bat「任意のキー」を押すのと同じ効果があります...
Kurt Pfeifle

25

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では削除されません。


18

環境変数を設定する際の検索と置換:

> @set fname=%date:/=%

...タイムスタンプ付きのファイル名で使用するために日付から「/」を削除します。

と部分文字列も...

> @set dayofweek=%fname:~0,3%

17

整数演算:

> SET /A result=10/3 + 1
4

SETが計算できるようになってからどのくらいになりますか?Windows XP?
chakrit 2009

1
値の大きさを尋ねるなら、これは32ビットだと思います。+/- 20億です。
Chris Noe、

1
問題は、SETが計算できる期間はどれくらいだったかと思います。Windows XP以降ですか?
マイケルマイヤーズ

3
CMD.EXEのSETは、NT 3.1以降から計算することができました。CMD.EXEがCOMMAND.COMとまったく同じではないことに誰もが気づくのに長い時間がかかりました...
RBerteig

16

コマンド区切り文字:

cls & dir
copy a b && echo Success
copy a b || echo Failure

2行目では、&&の後のコマンドは、最初のコマンドが成功した場合にのみ実行されます。

3行目の||の後のコマンド 最初のコマンドが失敗した場合にのみ実行されます。



15

ifステートメントを連鎖させて、ブール型の「and」のような効果を得ることができます。

if foo if bar baz

1
これは実際にはifをネストするためのショートカットにすぎません:(if foo ( if bar ( baz ) )括弧の後の改行を想像してください。)
idbrii

14

Unicodeテキストファイル(16ビット/文字)をASCII DOSファイル(8ビット/文字)にすばやく変換します。

C:\> type unicodeencoded.txt > dosencoded.txt

おまけとして、可能であれば、キャラクターは正しくマッピングされます。


1
これはANSI DOSファイルです-ASCIIは7ビット/文字です。
MarkJ 2010

笑、これはアンチパターンです。この変換は失敗する可能性が高いです。Unicodeをサポートする唯一の8ビットエンコーディングはUTF-8ですが、M $のおかげで、WindowsでUTF-8コードページを設定できません。
ソリン

14

ブロック構造の場合:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)

3
変数が一度にすべて展開されることを認識している限り(遅延展開なしで)、つまり、そこで%ERRORLEVEL%を使用することはできません。
Duncan Smart

また、ifステートメントが途中で終了するため、そこでラベル(::スタイルのコメントを含む)を使用することもできません。
スタイルのコーディング

2
@Duncan:%ERRORLEVEL%とにかく疑似変数を使用すべきではありません。それif errorlevel <foo>が目的です。そして、それは実際にそのようなブロックで機能します。
ジョーイ

12

変数の展開の遅延(適切な測定のために部分文字列がスローされます):

    @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

12

機能はそれほど多くありませんが、titleコマンドを使用すると、タスクバーで長いスクリプトのステータスを提供したり、ユーザーのフィードバックを強化したりすることができます。

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

2
面白い。その後は、通常の機能、つまり現在実行中のコマンドを表示する機能が失われたようです。それをリセットする方法はありますか?
Chris Noe

2
technet.microsoft.com/en-us/library/bb491017.aspxは、それ自身の「タイトル」とリセットすることができると言うが、これは... Windows 7で動作するようには思えない
ℳ。

11

便利なエディターがなく、バッチファイルを作成する必要がありますか?

copy con test.bat

コマンドを入力するだけで、Enterキーを押して改行します。Ctrl-ZとEnterキーを押してファイルを閉じます。


4
ふー、それで私は戻ってきます。
スタイルを使用したコーディング

11

文字列の減算の例にdatetime「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」は機能しません

色の名前は

色 ?


編集; _は斜体として解釈されました。ちょっとしたコード。

@Duncan Smart:正しくありません。英国英語でも機能します(技術的には「色」でなければなりませんが、grrr)
demoncodemonkey

10

スペースとエスケープ文字による出力の完全な制御。

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>

1
それはどのように機能しますか?ドットはテキスト出力の始まりを区別しますか?
Chris Noe、

3
「echo。x」は「<space> x」を出力し、「echo x」は「x」のみを出力します。これにより、スペースを先行できます。さらに、「^」エスケープ文字は、cmdがそれらすべての「<」および「>」文字をI / Oリダイレクトであると見なすのを防ぎます。
paxdiablo 2008年

1
echo(は、echo。が "echo"という名前のファイルのファイル検索を作成するため、このファイルが存在する場合、echo。が失敗します。存在しない場合、内部エコーが実行されますが、echo(
jeb

9

TheSoftwareJediは既にforコマンドについて説明しましたが、非常に強力であるため、もう一度説明します。

以下は、YYYYMMDD形式で現在の日付を出力します。バックアップ用のディレクトリを生成するときに使用します。

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a

2
確かにDATE / Tは、ヨーロッパでは2008年10月29日、米国では2008年10月29日を返すので、ローカライズが必要になる場合があります。;-)

そのとおり!ただし、dateコマンドを悪用して、使用されている日付形式を確認できます。
remonedo

4
FOR、imoの過度の使用です。日付コマンドを実行して解析するのではなく、%DATE:〜10,4 %% DATE:〜4,2 %% DATE:〜7,2%を使用するだけだと思います。
スタイルを使用したコーディング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.