はじめに
最近は滅多に使わないWindowsのコマンドライン処理やバッチ処理。
たまにWindows上でバッチを書くとコマンドが思い出せない!
よく使いそうな記述をスニペットとして掲載します。
- コマンドラインのスニペット
(巨大なファイルを作る。コマンドでzipを解凍。curl。他) - バッチのスニペット
- バッチ処理の構文例のメモ
- 参考文献
本編
1.コマンドラインのスニペット
テスト用に巨大なファイルを作る1
fsutil file createNew <ファイル名> <バイト数>
C:\work>fsutil file createNew tmpfile 1024
ファイル C:\work\tmpfile が作成されました
C:\work>dir
2021/01/10 21:09 1,024 tmpfile
- 注意:作られたファイルの中身は0埋め。実態を持たせるには1度copyすると良さそう。参考2を参照。
- 注意:ネットワーク転送の試験程度なら実用的。圧縮が効きすぎるので圧縮処理が伴う試験等には不適。
- 参考1:Microsoft Docs
- 参考2:@IT
テスト用に巨大なファイルを作る2
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1024));" > 1024.bin
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1048576));" > 1048576.bin
C:\work>dir
2021/01/11 11:55 1,024 1024.bin
2021/01/11 12:08 1,048,576 1048576.bin
純粋なWindowsコマンドじゃないので本記事の趣旨的には反則ですが・・
WindowsStoreでPythonは簡単に入りますので、お試しあれ。
管理者権限でターミナルの起動
コマンドプロンプトの起動(管理者権限)
C:\>powershell start -verb runas cmd
WindowsTerminalの起動(管理者権限)
C:\>powershell start -verb runas wt.exe
圧縮解凍
ZIPファイルの解凍
C:\>tar -xf something.zip
C:\>tar -cf something.zip target_dir
C:\>tar -tf something.zip
ウェブサイトへのアクセス(curl)
curlの実行
C:\>curl target_server
C:\>curl -v target_server
Telnetでサーバアクセス
Telnetの有効化
C:\>dism /online /Enable-Feature /FeatureName:TelnetClient
Telnetでアクセス
C:\>telnet server-address
システム情報を調べる(systeminfo)
systeminfoの実行
C:\>systeminfo
OS 名: Microsoft Windows 10 Pro
OS バージョン: 10.0.18363 N/A ビルド 18363
OS 製造元: Microsoft Corporation
OS 構成: スタンドアロン ワークステーション
OS ビルドの種類: Multiprocessor Free
システムの種類: x64-based PC
プロセッサ: 1 プロセッサインストール済みです。
[01]: Intel64 Family 6 Model 142 Stepping 9 GenuineIntel ~2703 Mhz
環境変数を設定閲覧する
SETXで永続的に設定
SETX http_proxy server:8080
↑ユーザスコープで永続的に設定される。消す時はGUIから消す。
[Win-key + pause/breakキー]-->[システムの詳細設定]-->[詳細設定]
クリップボードに張り付ける
clip < file.txt
→ ファイルの中身がコピーされる
dir /B | clip
→ 改行区切りでファイル一覧がコピーされる
cd C:\work
cd | clip
→ "C:\work"がコピーされる
cd C:\work
for /F "tokens=1 delims= " %a in ("%CD%") do @echo %~na | clip
cd C:\work
for /F "tokens=1 delims= " %%a in ("%CD%") do @echo %%~na | clip
→ "work"がコピーされる
for文の変数参照の置換機能を利用してsplitのような事をを実現している。
%~nIは、%I をファイル名だけに展開する。
2.コマンドメモ
コマンド | 動作 |
---|---|
cls | 画面のクリア |
clip | クリップボードへ貼り付け。例:clip < README.txt |
netstat -an | リッスン中のプロトコルとポート番号を表示 |
netstat -ano | 上記に加えてプロセスのIDを表示する |
tasklist | 動作中のプロセスのIDを一覧する。上記のIDと突合できる |
3.バッチ(.bat)のスニペット
バッチ処理の基本
コメント
rem コメント
バッチの初期化処理
コマンド表示の制御(@echo off)
@echo off
↑バッチ処理中、コマンド文字列そのものを画面に表示しない。
親環境を汚染しない(setlocal:環境変数のローカル化)
setlocal
↑バッチ終了後、バッチ処理内で設定した環境変数を元に戻す。
(set処理をローカル化する)
setlocalが無いと、バッチ終了後の環境変数が残る。
言語変更(chcp)
chcp 932
chcp 65001
chcp
↑コンソールで使う文字コードを設定する。
利用シーンとしては、処理するCSVファイルがUTF8の場合などに文字コードを変えて表示の文字化けを防ぐ。
引数が無いならバッチを終了
if "%1"=="" exit /b 1
引数の取得
set PARAM1=%1 ・・・引数は「%数字」で表す。%1は第一引数。
echo %PARAM1%
C\> test.bat "aaaa"
"aaaa"
上記はコマンドプロンプトの例。
不思議な事にPowerShellで実行すると引用句は表示されない。
引数の取得(引用句(")を除外して取得)
set PARAM1=%~1 ←ここがミソ。「第一引数から引用句を除く」という意味。
echo %PARAM1%
C\> test.bat "aaaa"
aaaa
全ての引数を別のバッチファイルに渡す。
@echo %* ・・・・「%*」が全引数を意味する。コマンドをbatでラッピングした場合に便利。
C\> test.bat aaa bbb
aaa bbb
ディレクトリの移動
カレントディレクトリを実行中のバッチの場所にする
cd /D %~d0%~p0
↑「/D」はドライブを横断してカレントを変更する為に必要。
↑「%0」は実行中のバッチファイルを示す。「%~d0」はバッチファイルのドライブ。「%~p0」はパス。
ファイル関連の処理
拡張子を取得
set ext = %~x1
↑第1引数に指定したファイルの拡張子を取得している。
タイムスタンプを取得
set timestamp = %~t1
↑第1引数に指定したファイルのタイムスタンプを取得している。
- 参考:
help CALL
ファイルが存在するなら(if [not] exist ファイル)
書式:if exist ファイルパス コマンド
指定したファイルが存在すれば表示
if exist %1 type %1
- 参考)
help if
カレントのファイルを全部表示する
for 変数 in (ファイル) do コマンド
for %%i in (*) do type %%i
※バッチ処理の中では%%iとする。%は2回。
※コマンドから直接実行するなら%は1回となる。
- 参考)
help for
環境変数の処理
パスを追加
set PATH=%PATH%;C:\bin
ユーザが入力した値を環境変数に設定
set /P INPUT=
計算
set /A ANS=1000*1000 ・・・/Aで計算式が使える。
環境変数の置換
書式:%変数:置換前文字=置換後文字%
set WORK_DIR=C:\
echo %WORK_DIR% =====> C:\が表示される
set WORK_DIR=%WORK_DIR:C=D%
echo %WORK_DIR% =====> D:\が表示される
環境変数から文字列を抜き出す
書式:%変数:~開始位置,取得する文字数%
位置は0からカウントする。
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8,5%
echo %SUBJECT% =====> HELLOになる
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8%
echo %SUBJECT% =====> HELLO FOOになる
- 参考)
help SET
その他
一時停止(pause)
pause
処理を停止して、続行するか確認する。
直前の処理の結果を画面で確認させたい場合に使える。
GUIのアプリを起動する(start)
start "" /WAIT notepad ファイルパス
start https://google.co.jp
組み込みの環境変数
カレントディレクトリ
echo %CD%
日付
echo %DATE%
時間
echo %TIME%
ランダム数字
echo %RANDOM%
4.バッチ処理の構文例のメモ
分岐 if
条件一致
if "変数"=="答え" コマンド
if "変数"=="答え" (
コマンド
)
set ans=Test
if "%ans%"=="Test" dir
ファイルが存在するなら
if [not] exist ファイルパス コマンド
if exist %1 type %1
- 参考:
help if
ループ
ファイルを繰り返し処理
for 変数 in (ファイル) do コマンド
for %%i in (*) do type %%i
for %%i in (*) do (
type %%i
)
※バッチ処理の中では%%iとする。%は2回。
※コマンドから直接実行するなら%は1回となる。
指定回数繰り返す
FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]
(1,1,5) は 1 2 3 4 5。(5,-1,1) は (5 4 3 2 1) 。
set MIN=1
set MAX=5
for /L %%i IN (%MIN%,1,%MAX%) do (
echo %%i
)
C:\work>test
1
2
3
4
5
forの中で計算する
REM forの内側で変化する変数は「!」で囲む必要がある。
REM 「setlocal enabledelayedexpansion~endlocal」で囲む
setlocal enabledelayedexpansion
set MIN=1 ・・・開始
set MAX=10 ・・・終了
set ANS=0 ・・・計算結果を格納する変数
for /L %%i IN (%MIN%,1,%MAX%) do ( ・・・%%iに1~10まで順番に設定される。
set /A ANS=!ANS!+%%i ・・・前回の答え(ANS)に次の数値(%%i)を足す。
)
echo !ANS! ・・・答えを表示
endlocal
C:\work>test
55
- 参考:
help for
参考文献
リファレンスとなる文書
- 各種コマンド
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-commands - バッチ処理の引数
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/call
または
help call