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

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

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

# 本編
## １．コマンドラインのスニペット 
### テスト用に巨大なファイルを作る１
```dosbatch:使用方法
fsutil file createNew <ファイル名> <バイト数>
```
```dosbatch:実行例（1024バイトのファイル作成）
C:\work>fsutil file createNew tmpfile 1024
```
```dosbatch:実行結果
ファイル C:\work\tmpfile が作成されました
C:\work>dir
2021/01/10  21:09             1,024 tmpfile
```
- 注意：作られたファイルの中身は0埋め。実態を持たせるには１度copyすると良さそう。参考２を参照。
- 注意：ネットワーク転送の試験程度なら実用的。圧縮が効きすぎるので圧縮処理が伴う試験等には不適。
- 参考１：[Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/fsutil-file)
- 参考２：[@IT](https://www.atmarkit.co.jp/ait/articles/0209/28/news002.html)

### テスト用に巨大なファイルを作る２
```dosbatch:実行例（1024バイトのファイル作成）
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1024));" > 1024.bin
```
```dosbatch:実行例（1MB/1,048,576バイトのファイル作成）
python -c "import sys; import numpy; sys.stdout.buffer.write(numpy.random.bytes(1048576));" > 1048576.bin
```
```dosbatch:実行結果
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は簡単に入りますので、お試しあれ。

### 管理者権限でターミナルの起動
#### コマンドプロンプトの起動（管理者権限）
```dosbatch:管理者権限でコマンドプロンプトを起動
C:\>powershell start -verb runas cmd
```

#### WindowsTerminalの起動（管理者権限）
```dosbatch:管理者権限でWindowsTerminalを起動
C:\>powershell start -verb runas wt.exe
```

### 圧縮解凍
#### ZIPファイルの解凍
```dosbatch:カレントフォルダにZIPファイルを解凍する
C:\>tar -xf something.zip
```
```dosbatch:フォルダ指定してZIPファイルを圧縮する
C:\>tar -cf something.zip target_dir
```
```dosbatch:ZIPを見る
C:\>tar -tf something.zip
```
- 参考：[Tar and Curl Come to Windows](https://docs.microsoft.com/en-us/virtualization/community/team-blog/2017/20171219-tar-and-curl-come-to-windows)
- 参考：[libarchive](http://libarchive.org/)

### ウェブサイトへのアクセス（curl）
#### curlの実行
```dosbatch:curlの実行
C:\>curl target_server
```
```dosbatch:curlを冗長表示で実行（リクエストやレスポンスヘッダを表示）
C:\>curl -v target_server
```
- 参考：[Tar and Curl Come to Windows](https://docs.microsoft.com/en-us/virtualization/community/team-blog/2017/20171219-tar-and-curl-come-to-windows)

### Telnetでサーバアクセス
#### Telnetの有効化
```dosbatch:Telnetの有効化（管理権限アリのコンソールで実行）
C:\>dism /online /Enable-Feature /FeatureName:TelnetClient
```
#### Telnetでアクセス
```dosbatch:Telnetの実行
C:\>telnet server-address
```

### システム情報を調べる（systeminfo）
#### systeminfoの実行
```dosbatch:systeminfoの実行
C:\>systeminfo
```
```dosbatch:実行結果（一部）
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
```

- 参照：[microsoft docs](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands)

### 環境変数を設定閲覧する
#### SETXで永続的に設定
```
SETX http_proxy server:8080
```
↑ユーザスコープで永続的に設定される。消す時はGUIから消す。
 [Win-key + pause/breakキー]-->[システムの詳細設定]-->[詳細設定]

### クリップボードに張り付ける
```dosbatch:ファイルの内容をクリップボードに張り付ける
clip < file.txt
```
→ ファイルの中身がコピーされる

```dosbatch:ファイルリストをクリップボードに張り付ける
dir /B | clip
```
→ 改行区切りでファイル一覧がコピーされる

```dosbatch:カレントディレクトリのフルパスをクリップボードに張り付ける
cd C:\work
cd | clip
```
→ "C:\work"がコピーされる

```dosbatch:カレントディレクトリの現在のディレクトリ名のみクリップボードに張り付ける
cd C:\work
for /F "tokens=1 delims= " %a in ("%CD%") do @echo %~na | clip
```
```dosbatch:(バッチファイルの中では%%と書く）
cd C:\work
for /F "tokens=1 delims= " %%a in ("%CD%") do @echo %%~na | clip
```
→ "work"がコピーされる
for文の変数参照の置換機能を利用してsplitのような事をを実現している。
%~nIは、%I をファイル名だけに展開する。




## ２．コマンドメモ
|コマンド|動作|
|---|---|
|cls|画面のクリア|
|clip|クリップボードへ貼り付け。例：clip < README.txt|
|netstat -an|リッスン中のプロトコルとポート番号を表示|
|netstat -ano|上記に加えてプロセスのIDを表示する|
|tasklist|動作中のプロセスのIDを一覧する。上記のIDと突合できる|


## ３．バッチ（.bat）のスニペット
### バッチ処理の基本
#### コメント
```
rem コメント
```



### バッチの初期化処理
#### コマンド表示の制御（@echo off）
```
@echo off
```
↑バッチ処理中、コマンド文字列そのものを画面に表示しない。


#### 親環境を汚染しない（setlocal：環境変数のローカル化）
```dosbatch:環境変数のローカル化
setlocal
```
↑バッチ終了後、バッチ処理内で設定した環境変数を元に戻す。
（set処理をローカル化する）
setlocalが無いと、バッチ終了後の環境変数が残る。

#### 言語変更（chcp）
```dosbatch:シフトJisにする
chcp 932
```
```dosbatch:UTF8にする
chcp 65001
```
```dosbatch:現在のコードページの表示
chcp
```
↑コンソールで使う文字コードを設定する。
利用シーンとしては、処理するCSVファイルがUTF8の場合などに文字コードを変えて表示の文字化けを防ぐ。

- 参考）コードページ
  - https://docs.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers

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

#### 引数の取得
```dosbatch:引数を取得
set PARAM1=%1　・・・引数は「%数字」で表す。%1は第一引数。
echo %PARAM1%
```
```dosbatch:実行例（test.bat）
C\> test.bat "aaaa"
"aaaa"
```
上記はコマンドプロンプトの例。
不思議な事にPowerShellで実行すると引用句は表示されない。

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

#### 全ての引数を別のバッチファイルに渡す。
```dosbatch:全引数を渡す（test.bat）
@echo %*    ・・・・「%*」が全引数を意味する。コマンドをbatでラッピングした場合に便利。
```
```dosbatch:実行例（test.bat）
C\> test.bat aaa bbb
aaa bbb
```

### ディレクトリの移動
#### カレントディレクトリを実行中のバッチの場所にする
```dosbatch:実行中のバッチファイルの場所に移動する
cd /D %~d0%~p0
```
↑「/D」はドライブを横断してカレントを変更する為に必要。
↑「%0」は実行中のバッチファイルを示す。「%~d0」はバッチファイルのドライブ。「%~p0」はパス。

### ファイル関連の処理
#### 拡張子を取得
```dosbatch:引数の拡張子を取得
set ext = %~x1
```
↑第１引数に指定したファイルの拡張子を取得している。
#### タイムスタンプを取得
```dosbatch:タイムスタンプを取得
set timestamp = %~t1
```
↑第１引数に指定したファイルのタイムスタンプを取得している。

- 参考：
  ```
  help CALL
  ```






#### ファイルが存在するなら（if [not] exist ファイル）
書式：if exist ファイルパス　コマンド

#### 指定したファイルが存在すれば表示

```
if exist %1 type %1
```
- 参考）
  ```
  help if
  ```

#### カレントのファイルを全部表示する
```dosbatch:書式
for 変数 in (ファイル) do コマンド
```
```dosbatch:カレントファイルを全部表示する例
for %%i in (*) do type %%i
```
※バッチ処理の中では%%iとする。%は２回。
※コマンドから直接実行するなら%は１回となる。


- 参考）
  ```
  help for
  ```

### 環境変数の処理
#### パスを追加

```dosbatch:パスを追加
set PATH=%PATH%;C:\bin
```

#### ユーザが入力した値を環境変数に設定
```
set /P INPUT=
```

#### 計算
```
set /A ANS=1000*1000  ・・・/Aで計算式が使える。
```


#### 環境変数の置換
書式：%変数:置換前文字=置換後文字%

```dosbatch:ドライブレターを書き換える
set WORK_DIR=C:\
echo %WORK_DIR% =====> C:\が表示される
set WORK_DIR=%WORK_DIR:C=D%
echo %WORK_DIR% =====> D:\が表示される
```

#### 環境変数から文字列を抜き出す
書式：%変数:~開始位置,取得する文字数%
位置は0からカウントする。

```dosbatch:９文字目から５文字目を抜き出す
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8,5%
echo %SUBJECT% =====> HELLOになる
```
```dosbatch:９文字目以降を抜き出す
set INPUT=Subject:HELLO FOO
set SUBJECT=%INPUT:~8%
echo %SUBJECT% =====> HELLO FOOになる
```
- 参考）
  ```
  help SET
  ```

### その他
#### 一時停止（pause）
```
pause
```
処理を停止して、続行するか確認する。
直前の処理の結果を画面で確認させたい場合に使える。

#### GUIのアプリを起動する（start）
```dosbatch:メモ帳でファイルを開く（メモ帳が終了するまで待つ）
start "" /WAIT notepad ファイルパス
```
```dosbatch:googleをブラウザで開く
start https://google.co.jp
```

### 組み込みの環境変数
#### カレントディレクトリ
```
echo %CD%
```

#### 日付
```
echo %DATE%
```

#### 時間
```
echo %TIME%
```

#### ランダム数字
```
echo %RANDOM%
```

## ４．バッチ処理の構文例のメモ
### 分岐 if
#### 条件一致
```dosbatch:単一行の構文
if "変数"=="答え" コマンド
```
```dosbatch:複数行の構文
if "変数"=="答え" (
    コマンド
)
```
```dosbatch:記載例
set ans=Test
if "%ans%"=="Test" dir
```

#### ファイルが存在するなら
```dosbatch:構文
if [not] exist ファイルパス　コマンド
```
```dosbatch:記載例（引数に指定したファイルが存在すれば表示）
if exist %1 type %1
```
- 参考：
  ```
  help if
  ```

### ループ
#### ファイルを繰り返し処理
```dosbatch:構文
for 変数 in (ファイル) do コマンド
```
```dosbatch:記載例（カレントのファイルを全部表示する）
for %%i in (*) do type %%i
```
```dosbatch:記載例（カレントのファイルを全部表示する）｛複数行Ver｝
for %%i in (*) do (
    type %%i
)
```
※バッチ処理の中では%%iとする。%は２回。
※コマンドから直接実行するなら%は１回となる。

#### 指定回数繰り返す
```dosbatch:構文
FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンド パラメーター]
```
(1,1,5) は 1 2 3 4 5。(5,-1,1) は (5 4 3 2 1) 。

```dosbatch:記載例（\work\test.bat）
set MIN=1
set MAX=5
for /L %%i IN (%MIN%,1,%MAX%) do (
echo %%i
)
```
```dosbatch:実行例
C:\work>test
1
2
3
4
5
```

#### forの中で計算する
```dosbatch:記載例（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
```
```dosbatch:実行例
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
```