web-dev-qa-db-ja.com

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

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

ガイドライン:

  • 回答ごとに1つの機能
  • フィーチャーの短いdescriptionexampleの両方を与えるドキュメントへのリンク
  • 答えをnative funtionalityに制限します。つまり、Windows Resource Kitのような追加のソフトウェアを必要としません。

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

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

232
Chris Noe

行の継続:

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

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

POPD

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

150
raven

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

C:\some_directory> start .

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

これはすばらしい時間の節約になりました。

109

私はいつも、各行のキーワードでマークされたコメントを読むのが難しいと感じています:

REM blah blah blah

読みやすい:

:: blah blah blah
87
Chris Noe

可変部分文字列:

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

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

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

72
TheSoftwareJedi

REMまたは::行でスクリプトを散らかすのではなく、各スクリプトの上部で次のことを行います。

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

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

60
Patrick Cuff

スクリプトが存在するパス(ドライブ付き):〜dp0

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

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

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

43
Ferruccio

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
42
paxdiablo

「配管」のエスケープ:

echo ^| ^< ^> ^& ^\ ^^
37
Chris Noe

コマンドを実行し、出力を処理できること(bashの '$()'のバックティックなど)。

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

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

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

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

> copy nul filename.ext
30
nzpcmad

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

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

PSKILL NOTEPAD >nul 2>&1

編集: コマンドの出力を無視する をご覧ください。

28
aphoria

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

25
paxdiablo
PAUSE

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

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

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

25
raven

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

> @set fname=%date:/=%

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

そしてサブストリングも...

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

整数演算:

> SET /A result=10/3 + 1
4
17
Chris Noe

コマンド区切り記号:

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

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

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

16
doekman

Ifステートメントを連鎖させて、短絡論理演算子「and」のような効果を得ることができます。

if foo if bar baz
15
Jack

空白行を出力します:

echo.
15
paxdiablo

ブロック構造の場合:

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

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

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

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

14
RealHowTo

多くの機能は提供しませんが、タスクバーの長いスクリプトのステータスの提供、またはユーザーフィードバックの強化など、いくつかの用途にtitleコマンドを使用できます。

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

変数の遅延展開(適切な測定のためにサブストリングがスローされます):

    @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
paxdiablo

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

copy con test.bat

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

11
Hartmut

「__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」は機能しません

色の名前の呼び出し

色 ?

11
MoreThanChaos

スペースとエスケープ文字を使用した出力の完全な制御:

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

TheSoftwareJediは既にforコマンドについて言及しましたが、非常に強力なので再度言及します。

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

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

Callを使用して後で名前を評価し、いくつかの有用なプロパティに導くことができます。

call set SomeEnvVariable_%extension%=%%%somevalue%%%

Callを使用して、名前が他の変数に依存する変数を設定します。いくつかの変数命名規則を使用する場合、注意深い命名規則を使用して、配列や辞書などのデータコレクションをエミュレートできます。 somevalueの周りのトリプル%は、呼び出しの後、setが呼び出される前に、単一の%で囲まれた1つの変数名に評価されます。これは、2つの%が連続して1つの%文字にエスケープすることを意味し、その後再び展開するため、somevalueは事実上名前ポインターです。

call set TempVar=%%SomeEnvVariable_%extension%%%

これを一時変数で使用して値を取得し、ロジックで使用できます。これは、遅延変数展開と組み合わせて使用​​する場合に最も役立ちます。

この方法を適切に使用するには、遅延変数の展開を有効にする必要があります。デフォルトではオフになっているため、これを最初の指示の1つとして、スクリプト内で有効にするのが最善です。

setlocal EnableDelayedExpansion
8
Lara Dougan

パス(または必要に応じて他のパスのような文字列)で実行可能ファイルを検索します。

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:\>
7
paxdiablo

コメントにREMの代わりに::を使用することに関して:注意してください! ::は、コメントのように動作するCALLラベルの特殊なケースです。たとえば、FORループやIFループで角かっこ内で使用すると、関数は途中で終了します。デバッグするのは非常にイライラする!

完全な説明については、 http://www.ss64.com/nt/rem.html を参照してください。

上記の最初の言及)へのコメントの代わりに新しい回答として追加 私はまだ通う価値がないので:0:0)

7
matt wilkie

ENDLOCALが使用する行のローカル変数は引き続き解析されます。これにより、次のようなトリックが可能になります。

ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%

これは、呼び出しコンテキストに結果を送信する便利な方法です。具体的には、ENDLOCALが完了するとすぐに%SOMELOCAL%が範囲外になりますが、それまでに%SOMELOCAL%は既に展開されているため、MYGLOBALはローカル変数を使用して呼び出しコンテキストに割り当てられます。

同じ理由で、あなたがすることに決めた場合:

ENDLOCAL & SET MYLOCAL=%MYLOCAL%

新しいMYLOCAL変数は、実際には、意図したローカライズされた変数ではなく、通常の環境変数として存在していることがわかります。

6

最近では多くの人がGOTO:EOFを使用してバッチファイルを終了していますが、この目的でEXIT/Bを使用することもできます。

EXIT/Bを使用することの利点は、EXIT/Bの後にエラーレベルを追加でき、そのエラーレベルで終了することです。

6

Cmd.exeのクイック編集モードは私のお気に入りです。これは少しトピックから外れていますが、コマンドシェルと対話するときに、命の恩人になる可能性があります。いいえ、私は双曲的ではありません-caret-capitol-v死ぬまでに一定の回数しか表示されません。見れば見るほど死にます。

  1. Regeditを開きます(注意、私のせいではなく、ブルースクリーンなど)
  2. HKCU /コンソールに移動
  3. QuickEditを1に設定します

(これはUIからも設定できます。これがおそらくより良い方法です。手順についてはコメントを参照してください。また、これを行うニースの1行スクリプトもあります。)

コピーするには、左クリックしてドラッグして選択し、右クリックしてコピーします。貼り付けるには、右クリックします。

もうない^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V !!!

クラップ、私は誰かを殺したと思う。ごめんなさい!

5
Will

呼び出しセット-環境変数を数レベル深く展開します。

これは 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
5
Andy Morris

サブルーチン(出力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
5
paxdiablo

「ディレクトリの削除」のサブディレクトリオプション:

rd /s /q junk
4
paxdiablo

バッチの出力が既に> con構文を介してファイルにリダイレクトされている場合でも、出力をコンソールにリダイレクトします。

例:foo.cmd:

echo a
echo b > con

呼び出し:

foo.cmd > output.txt

これにより、"a"output.txtになり、さらに"b"がコンソールになります。

4
NicJ
SHIFT

これは、コマンドラインでスクリプト(またはサブルーチン)に渡される可変数の引数を反復処理する方法です。最も単純な使用法では、%2を%1に、%3を%2に、などにシフトします。 (複数の引数をスキップするためにSHIFTにパラメーターを渡すこともできます。)これにより、コマンドは「破壊的」になります(つまり、%1は永久になくなります)が、サポートされる引数の最大数をハードコーディングすることを回避できます。

コマンドライン引数を1つずつ処理する簡単な例を次に示します。

:ParseArgs

if "%1"=="" (
    goto :DoneParsingArgs
)

rem ... do something with %1 ...

shift

goto :ParseArgs


:DoneParsingArgs

rem ...
4
reuben

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に割り当てるのではなく、直接エラーレベルをテストできますが、この方法では、テストと条件の間にコマンドを配置し、必要に応じて条件を繰り返しテストできます。

4
batch fool

現在の日、月、年を取得します(ロケールに依存しません):

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

数値変数を持つループの正しい形式は

for /l %%i in (startNumber, counter, endNumber) do echo %%i

詳細> http://www.ss64.com/nt/for.html

3
Alin Sfetcu

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)。

詳細は CHOICESS64.com のリファレンスページをご覧ください。

3
NicJ

ブランチ間でファイルをコピーする場合の便利なトリック:

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%環境変数と環境変数置換の両方を使用します。

3
Igor Dvorkin

スクリプト内からstdinを解析するには、FORコマンドとFINDコマンドを使用したトリックが必要です。

for /f "tokens=*" %%g in ('find /V ""') do (
     :: do what you want with %%g
     echo %%g
)
3

バッチファイル内の配列。

値を設定します。

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%
2
Ben Burnett

/ c cmd.exe自体のparamは、これらのコマンドを実行してから実行するように指示します。

私は自分が頻繁にやっていることに気付いていました

win + r、 cmd 戻る、 ping google.com 戻る

しかし、今私はちょうど:

win + r、 cmd/c ping google.com 戻る

はるかに高速。また、pstoolsを使用していて、psexecを使用してリモートマシンでコマンドライン機能を実行する場合にも役立ちます。

編集:/ k 同じように機能しますが、プロンプトは開いたままにします。これは、より頻繁に役立つ場合があります。

2
Dean Rather

forfiles は、たとえば、2日以上経過したすべてのファイルを再帰的に削除する場合に非常に便利です。

forfiles /D -2 /P "C:\Temp" /S /C "cmd /c del @path"
2
Brecht Yperman

価値のあることについては、 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 に進みます。

2
Ben Burnett

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>
2
thatbrentguy

コマンドの出力をファイルにリダイレクトできるのは非常に便利です。

DIR *.txt > tmp.txt
DIR *.exe >> tmp.txt

一重矢印はファイルを作成または上書きし、二重矢印はファイルに追加します。これで、テキストエディターでtmp.txtを開いて、あらゆる種類の機能を実行できます。

2
raven

正規表現をサポートするFindstr:

findstr "^[0-9].*" c:\windows\system32\drivers\etc\hosts
2
BartekB

パイプ「|」を使用して、フォルダー内のファイル内の文字列を検索しますコマンド:

dir /b *.* | findstr /f:/ "thepattern"
2
Frans Bouma

&::を使用したコメントのインライン化。

:: 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
1

SET /Pを使用してファイルから環境変数を設定する

SET /P SVNVERSION=<ver.tmp
1
Anton Tykhyy

「%」ディレクティブを指定しなくても、環境変数に基づいてディレクトリを変更できます。指定された変数が存在しない場合は、ディレクトリ名を試してください。

@if defined %1 (call cd "%%%1%%") else (call cd %1)
1
Paul Hobbs

コピーを使用してファイルを追加します。

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!
1
DaWolfman

新しいファイルを作成して編集を開始する

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
1
dave1010

シンボリックリンク:

mklink /d directorylink ..\realdirectory
mklink filelink realfile

このコマンドは、VistaやWindows 7など、Windows Server 2008以降にネイティブです(一部のWindowsリソースキットにも含まれています)。

1
Soulman

ディレクトリツリー内の文字列を再帰的に検索します。

findstr /S /C:"string literal" *.*

正規表現も使用できます。

findstr /S /R "^ERROR" *.log

再帰的なファイル検索:

dir /S myfile.txt
1
bneal

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
1
Chris Noe

エラー時に保釈します。

IF "%errorlevel%" NEQ "0" (
   echo "ERROR:  Something broke.  Bailing out."
   exit /B 1
)
1
caseyboardman

上記と同様に、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
MadKat

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
1
PabloG

エラーレベルを任意の数値に設定する方法:

CMD/C EXIT番号
1

対話型バッチスクリプトの入力を非表示にします。

  @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
1

DEBUG.EXEはバッチファイルの非常に有用で非常に十分に使用されていない機能だと思います。

DEBUGコマンドを使用すると、次のことができます...

  1. 16ビットコードのアセンブルと逆アセンブル
  2. 読み取り/書き込みメモリ(現代の保護されたメモリは、これをかなり役に立たなくします。)
  3. 未加工のハードドライブからデータセクターを読み取る
  4. 六角形の編集

要するに、このツールは非常に強力です。最近ではあまり使用されていないかもしれませんが、バッチスクリプトからこの機能を呼び出して制御する力により、バッチスクリプトに驚異的な量の力が追加されます。

注:MicrosoftはこのコマンドをWindows XPおよびVistaの64ビットエディションから削除し、私が聞いたことからWindows 7から完全に削除する予定です。

1

周囲の引用符を削除します。

for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a

最近、VS prebuildイベントによって呼び出されるバッチファイルを作成する必要があり、プロジェクトディレクトリにパラメーターとして渡したいと思います。バッチファイルでは、パスとネストされたサブフォルダー名を連結する必要がありますが、最初に周囲の引用符を削除する必要があります。

1
Fadrian Sudaman

ここで、指定されたディレクトリをスキャンして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 *")。

1
RealHowTo
HELP

異なるOSバージョンを使用する場合、ネイティブで使用可能なコマンドを知ることが重要です。コマンドプロンプトでHELPと入力すると、使用可能なコマンドとその機能の簡単な説明が表示されます。

cmd.exe /? 

これにより、コマンドプロンプトを起動するためのすべてのコマンドラインパラメーターと、システム全体の動作を変更するレジストリ調整が一覧表示されます。

0
Mark Arnott

数値カウンターを使用したループの場合(出力1〜10):

for /l %i in (1,1,10) do echo %i
0
paxdiablo

実行中にバッチファイルを変更できます。たとえば、バッチファイルを終了する前に結果を確認したい場合は、実行中に忘れたpauseをファイルの末尾に追加できます。

実行中のバッチファイルの変更 を参照してください

私は個人的に、これを機能というよりも落とし穴だと考えています。

0
Mashmagar

このバッチファイルは、コマンドラインパラメータとしてbothとシンプルなfilesおよびdirectoriesで機能します(任意の順序で混合できます)。ループは、指定されたファイルに対してコマンド(この例では「エコー」)を実行します。パラメーターがディレクトリの場合、そのファイル内の各ファイルに対してコマンドを再帰的に実行します。

@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f
0
Sascha

ログファイルなどに使用する現在の日付/時刻を取得するには、バッチファイルでこれを使用します。

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
0
jftuga

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 :)
0
Deniz Zoeteman

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
)

非常に高速で効果的です。

0
guerda

行ベースの実行

ほとんどの場合、明確な利点ではありませんが、実行中に更新を試みるときに役立ちます。例えば:

UpdateSource.bat

copy UpdateSource.bat Current.bat
echo "Hi!"

Current.bat

copy UpdateSource.bat Current.bat

現在、Current.batを実行するとこの出力が生成されます。

HI!

ウォッチアウトただし、バッチ実行は行番号で進行します。このような更新では、重要な行の行番号がまったく同じでない場合、行をスキップまたは元に戻す可能性があります。

0
John Fisher

スクリプトで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はそれらを復元しません。

0

私はこれが本当に好きです Windows XPコマンド リファレンス、および 構文 上部のリンク;他の回答で既に見つかった多くのヒントとコツをカバーしています。

0
leander

不明な数のパラメーターをバッチファイルに渡すとき、たとえば複数のファイルを起動してバッチファイルにドラッグアンドドロップすると、各パラメーター変数を名前で参照できます。

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になります。

0
sahmeepee

一般的に使用されるディレクトリへのクイックショートカットとして使用します。 PATHのディレクトリにある「sandbox.bat」という名前のサンプルファイル

Explorer "C:\Documents and Settings\myusername\Desktop\sandbox"

スクリプトの呼び出しは、WIN + R->サンドボックスだけです

0
jon_brockman

環境変数の合計サイズを取得する非常に古い(1990年頃)トリック:

set > test
dir test
del test
0
some

これは、バッチファイルを何度もクリックすることなく、My Nant Buildスクリプトを連続して実行するために使用する1つのトリックです。

:CODELINE
NANT.EXE -buildfile:alltargets.build -l:build.log build.product
@pause
GOTO :CODELINE

ソリューションの構築が完了すると、ソリューションは一時停止します。そして、いずれかのキーを押すと、ビルドスクリプトが再実行されます。とても便利です。

0
RWendi

EDLINコマンドもあります。かつて行ベースのテキスト編集に使用されていた古いろくでなしツールかもしれませんが、コマンドラインから制御できるという事実は、主にEDLINを使用する他の場合と同様に、バッチスクリプトにかなり便利です利用可能な唯一のツール。結局のところ、EDLINは、多少自虐的でない限り、通常テキスト編集に使用したいツールではありません。ティム・パターソン(それを書いたフェロー)を引用すると:「IBMがそれを使用していて、窓の外に捨てていないことを聞いたとき、私は驚きました。」

注:EDLINは、編集するファイルに旧式のEOF(1A)マーカーを追加します。それらを削除する必要がある場合は、おそらくDEBUGを使用する必要があります。

0