windows - win7 attrib




Windowsバッチファイルの隠し機能 (20)

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

ガイドライン:

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

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

Windowsバッチファイル:.bat vs .cmd?も参照してください)


"YYYY-MM-DD HH:MM:SS.txt"という名前のファイルを取得するdatetimeの文字列減算の例

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進数値です0ここで、X - 背景、Y - テキスト、X = Yの色は変更されません。

色Z

テキストの色を「Z」に変更し、黒の背景を設定すると、「カラー0」は機能しません

色の名前を呼び出す

色 ?


"配管"を脱出する:

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

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

Unicodeテキストファイル(16bit / char)をASCII DOSファイル(8bit / char)に素早く変換する。

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

ボーナスとして、可能であれば、文字が正しくマップされます。


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


%〜dp0の部分はすでに言及されていましたが、実際には〜に続く文字が抽出されます。
パッチファイル名が返されない
d - ドライブ文字を返す
p - パスを返す
s - 短いパスを返す
x - ファイル拡張子を返す
したがって、c:\ Temp \ longディレクトリ名\フォルダから以下のスクリプト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\

また、パラメータが次のようにスクリプトに渡された場合
テスト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

FORコマンド ! 私はバッチファイルを書くことが嫌いですが、私はそれに感謝しています。

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

myfile.txt内の各行を解析し、セミコロンで始まる行は無視し、各行から2番目と3番目のトークンをforの本文に渡し、トークンはカンマやスペースで区切ります。 第2のトークンを取得するために%i、第3のトークンを取得するために%j、残りのトークンをすべて取得するために%kを参照してください。

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


エディタを手元に置いてバッチファイルを作成する必要はありませんか?

copy con test.bat

コマンドを入力し、Enterを押して新しい行を入力してください。 Ctrl + Zキーを押してファイルを閉じます。


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

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

ファイル名に空白がある場合は、次のように使用します。

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

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

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

スクリプトをREMまたは:: linesで捨てるのではなく、各スクリプトの先頭に次のように記述します。

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

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


ブロック構造の場合:

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

可変部分文字列:

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

多くの機能を提供するわけではありませんが、タスクバーの長いスクリプトのステータスを提供するなど、titleコマンドを使用してユーザーのフィードバックを向上させることができます。

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

整数演算:

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

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

REM blah blah blah

読みやすい:

:: blah blah blah

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

> copy nul filename.ext

行の継続:

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

PAUSE

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

Press any key to continue . . .

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







hidden-features