Dosコマンドめも

備忘用。

## バッチの最後に仕込むやつ(pauseの代わり)
```dosbatch:dosプロンプトで
timeout /nobreak 10
exit /b
```
<br>


## DOSバッチにJScript埋め込み(Chakra)
[Windowsでshebangもどき、またはバッチにスクリプトを埋め込む方法](https://qiita.com/snipsnipsnip/items/50e4ca88e3ce3f8cffda)より
<details><summary>js.bat</summary><div>

```dosbatch:dosプロンプトで
<!-- : ^
/*
@cscript /nologo /e:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} "%~f0" %*
@exit /b %errorlevel%
*/
// 以下スクリプトの内容 //
"use strict"
WScript.stdout.writeline("foo");
```
</div></details>
<br>


## 所定ディレクトリ配下の全削除

<details><summary>EXEC_DELETE_ALL.bat</summary><div>

```dosbatch:dosプロンプトで
@echo off
cls

SET /P ANSWER="XXXXを削除します。よろしいですか (Y/N)？"

if /i {%ANSWER%}=={y} (goto :yes)
if /i {%ANSWER%}=={Y} (goto :yes)
if /i {%ANSWER%}=={yes} (goto :yes)
EXIT

:yes
echo 処理開始

rem バックアップ
set time2=%time: =0%
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set hour=%time2:~0,2%
set minute=%time2:~3,2%
set second=%time2:~6,2%
zip -r -q -1 XXXX_%year%%month%%day%%hour%%minute%%second%.zip \AAAA\BBB\XXXX

rem ### XXXX ###
call :procDel XXXX,YYYY

echo 処理終了...
pause
exit

:procDel
  setlocal
    set targetDir=%1
    cd XXXX\%targetDir%
    set version=%2
    dir /A:D /B /S | findstr "%version%[^\\]*$" > temp.txt
    for /f %%f in (temp.txt) do rmdir /S /Q "%%f"
    del temp.txt
  endlocal
goto :EOF
```
</div></details>
<br>


## シンボリックリンク作成
```dosbatch:dosプロンプトで
mklink /D C:\work\hoge "C:\Program Files\hoge"
```
<br>


## SQL*PLUSでテーブル作成・データ投入・検索を実行

<details><summary>EXEC_SQLPLUS.bat</summary><div>

```dosbatch:EXEC_SQLPLUS.bat
@echo off
setlocal
pushd "%~dp0"
cls
set CON={userId}/{pass}@{SID}
set SCHEMEID={schemeId}
echo CREATE TABLE %SCHEMEID%.emp(empno VARCHAR2(10) NOT NULL, empname VARCHAR2(50), gender_f NUMBER(1,0), constraint EMP_PK primary key(empno)); |sqlplus %CON%
echo INSERT INTO %SCHEMEID%.emp(empno, empname, gender_f) VALUES('1234567001', 'Tommy', 0); |sqlplus %CON%
echo INSERT INTO %SCHEMEID%.emp(empno, empname, gender_f) VALUES('1234567002', 'Jenifer', 1); |sqlplus %CON%
echo SELECT * FROM %SCHEMEID%.EMP; |sqlplus %CON% > SELECT_EMP_RESULT.txt
popd
pause
```
</div></details>
<br>


## マシンのシリアルナンバー表示

<details><summary>マシンのシリアルナンバー表示.bat</summary><div>

```dosbatch:マシンのシリアルナンバー表示.bat
@echo off
setlocal
​
pushd "%~dp0"
​
cls
@rem Get the serialnumber of your machines. (Latitude 5300 etc..)
wmic bios get serialnumber
​
popd
​
pause
```
</div></details>
<br>


## SHA256ハッシュ値を確認(dos-batch)
検査対象ファイルと同梱される「〜.sha256」ファイルをD&Dしてください。
※検査対象ファイルと「〜.sha256」ファイルは同じパスに格納前提

<details><summary>sha256Checker.bat</summary><div>

```dosbatch:sha256Checker.bat
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0

if "%1" == "" goto PARAM_ERROR
if NOT EXIST "%1" (
  goto NOT_FOUND_ERROR
)

REM 検査値の取得.
for /f "tokens=1,2" %%a in (%1) do (
  set TESTHASH=%%a
  set filename=%~dp1%%b
)

REM 実値の取得.
for /f "usebackq" %%A in (`CERTUTIL -hashfile !filename! SHA256 ^| FIND /V ":"`) do set REALHASH=%%A

if !TESTHASH!==%REALHASH% (
  echo result: OK!
) else (
  echo result: hash値が一致しません。
  echo 検査値: !TESTHASH!
  echo 実値　: %REALHASH%
)
pause
exit /B

:PARAM_ERROR
echo このバッチへ対象ファイルをドラッグ＆ドロップしてください
pause
exit /B

:NOT_FOUND_ERROR
echo ファイル、または、フォルダが見つかりません
pause
exit /B
```
</div></details>
<br>


## SHA256ハッシュ値を確認
```shell
CertUtil -hashfile <ファイル名> SHA256
```
<br>


## フォルダ削除後にフォルダごとコピー
```shell
@echo off
rd /s /q {ファイルパス2}
rem ファイルパス2には、移動元のディレクトリ名を含める
echo d | xcopy /e {ファイルパス1} {ファイルパス2}
pause
```
<br>


## 同名のプロセスを一括強制終了する方法
```shell
taskkill /f /im <プロセスのイメージ名>

例：
taskkill /f /im devenv.exe
```
<br>


## バッチ実行パスへ移動
```shell
cd /d %~dp0
```
<br>


## DHCPアドレス枯渇対策
5per-minute, 1000回実行。

```shell
cmd /v:on /c "for /L %i in (1,1,1000) do @call timeout 300 /nobreak >nul & ipconfig -release >nul & timeout 2 /nobreak >nul & ipconfig -renew >nul & echo %i回目実行."
```
<br>


## Zundoko-Kiyoshi Problem
[コマンドプロンプトのワンライナーでズンドコキヨシ](https://kunst1080.hatenablog.com/entry/2016/03/13/135807)より

```shell
cmd /v:on /c "for /L %i in (1,1,1000) do @call set /a a5=a4,a4=a3,a3=a2,a2=a1,a1=^%RANDOM^% % 2 >nul & set A=!a5!!a4!!a3!!a2!!a1!& if !a1!==1 (echo ズン) else (echo ドコ) & if !A!==11110 echo キ・ヨ・シ！ & exit"
```