LoginSignup
2
2

More than 1 year has passed since last update.

Windowsコマンドやバッチのスニペット

Last updated at Posted at 2020-12-19

はじめに

最近は滅多に使わないWindowsのコマンドライン処理やバッチ処理。
たまにWindows上でバッチを書くとコマンドが思い出せない!
よく使いそうな記述をスニペットとして掲載します。

  1. コマンドラインのスニペット
     (巨大なファイルを作る。コマンドでzipを解凍。curl。他)
  2. バッチのスニペット
  3. バッチ処理の構文例のメモ
  4. 参考文献

本編

1.コマンドラインのスニペット

テスト用に巨大なファイルを作る1

使用方法
fsutil file createNew <ファイル名> <バイト数>
実行例(1024バイトのファイル作成)
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

実行例(1024バイトのファイル作成)
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1024));" > 1024.bin
実行例(1MB/1,048,576バイトのファイル作成)
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の起動(管理者権限)

管理者権限でWindowsTerminalを起動
C:\>powershell start -verb runas wt.exe

圧縮解凍

ZIPファイルの解凍

カレントフォルダにZIPファイルを解凍する
C:\>tar -xf something.zip
フォルダ指定してZIPファイルを圧縮する
C:\>tar -cf something.zip target_dir
ZIPを見る
C:\>tar -tf something.zip

ウェブサイトへのアクセス(curl)

curlの実行

curlの実行
C:\>curl target_server
curlを冗長表示で実行(リクエストやレスポンスヘッダを表示)
C:\>curl -v target_server

Telnetでサーバアクセス

Telnetの有効化

Telnetの有効化(管理権限アリのコンソールで実行)
C:\>dism /online /Enable-Feature /FeatureName:TelnetClient

Telnetでアクセス

Telnetの実行
C:\>telnet server-address

システム情報を調べる(systeminfo)

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)

シフトJisにする
chcp 932
UTF8にする
chcp 65001
現在のコードページの表示
chcp

↑コンソールで使う文字コードを設定する。
利用シーンとしては、処理するCSVファイルがUTF8の場合などに文字コードを変えて表示の文字化けを防ぐ。

引数が無いならバッチを終了

第一引数が無いならバッチを終了
if "%1"=="" exit /b 1

引数の取得

引数を取得
set PARAM1=%1 ・・・引数は「%数字」で表す。%1は第一引数。
echo %PARAM1%
実行例(test.bat)
C\> test.bat "aaaa"
"aaaa"

上記はコマンドプロンプトの例。
不思議な事にPowerShellで実行すると引用句は表示されない。

引数の取得(引用句(")を除外して取得)

引数から引用句(")を除外して取得(test.bat)
set PARAM1=%~1 ←ここがミソ。「第一引数から引用句を除く」という意味。
echo %PARAM1%
実行例(test.bat)
C\> test.bat "aaaa"
aaaa

全ての引数を別のバッチファイルに渡す。

全引数を渡す(test.bat)
@echo %*    ・・・・「%*」が全引数を意味する。コマンドをbatでラッピングした場合に便利。
実行例(test.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からカウントする。

9文字目から5文字目を抜き出す
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8,5%
echo %SUBJECT% =====> HELLOになる
9文字目以降を抜き出す
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8%
echo %SUBJECT% =====> HELLO FOOになる
  • 参考)
    help SET
    

その他

一時停止(pause)

pause

処理を停止して、続行するか確認する。
直前の処理の結果を画面で確認させたい場合に使える。

GUIのアプリを起動する(start)

メモ帳でファイルを開く(メモ帳が終了するまで待つ)
start "" /WAIT notepad ファイルパス
googleをブラウザで開く
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
記載例(カレントのファイルを全部表示する){複数行Ver}
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) 。

記載例(\work\test.bat)
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の中で計算する

記載例(1から10を足してみる(\work\test.bat))
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

参考文献

リファレンスとなる文書

help call
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2