【編集中】Windowsバッチ関連まとめ

# TODO
- [ ]  7Zip⇒D&Dで圧縮できるバッチを用意したい!!
- [ ]  Sleep関連⇒timeoutコマンド
- [ ]  ネットワークドライブの割り当て/切断
- [ ]  リモートデスクトップ接続(mstsc)

# コマンドプロンプト操作
## if文操作

【参考サイト】
　◆.bat（バッチファイル）のifコマンド解説。
　　https://qiita.com/plcherrim/items/8edf3d3d33a0ae86cb5c

## ファイル比較
※行レベルで様々な比較オプション有

【参考サイト】
　◆fc - Windowsコマンド虎の巻
　　https://windows.command-ref.com/cmd-fc.html

## Oracle操作
```sh:oraora.bat
> echo select * from dual;  | sqlplus scott/tiger
```
【参考サイト】
　◆SQL*Plus に標準入力からSQL文を流し込む
　　https://qiita.com/chimatter/items/ceb8e298a5eb6f466fdf


## ファイル検索
```sh:searchFile.bat

REM 

REM 指定フォルダ内の特定日付以降のファイル一覧表示
FORFILES /P C:\wakasama /S /D +2021/8/25 /C "cmd /c echo @path,@fdate @ftime,@fsize" > result.csv

REM csvファイルをExcelで開いてデータ加工
```
【参考サイト】
　◆Windowsのforfilesコマンドで条件に合うファイルを取り出して処理する
　　https://atmarkit.itmedia.co.jp/ait/articles/0902/27/news132.html
　◆Windowsで容量の大きいファイル&ディレクトリを調べる
　　https://orebibou.com/ja/home/201501/20150113_001/
　◆【Windows】forfilesコマンドで指定サイズ以上のファイル一覧を取得する
　　https://moripro.net/windows-forfiles-get-filepath/#forfiles

## 曜日チェック
```sh:weekdayCheck.bat
REM weekday.vbs
WScript.Quit(WeekDay(Date)+1)

REM == 曜日の取得 ============
cscript /b weekday.vbs
if %errorlevel%==8 set WDAY=Sat
if %errorlevel%==7 set WDAY=Fri
if %errorlevel%==6 set WDAY=Thu
if %errorlevel%==5 set WDAY=Wed
if %errorlevel%==4 set WDAY=Tue
if %errorlevel%==3 set WDAY=Mon
if %errorlevel%==2 set WDAY=Sun
if %errorlevel%==1 set WDAY=ERROR
REM ==========================
```
【参考サイト】
　◆VBSCRIPTを実行BATファイルに含める方法
　　https://qiita.com/fusafusa/items/71dfae83910fb3de2aa3
　◆BATとWSHのコードを1ファイルに混在させるためのshebang記法（複雑なバッチを１ファイルで実現）
　　https://computer-technology.hateblo.jp/entry/20131025/p1


## 削除
```sh:delete.bat
REM 更新日時が新しい２つ(skip=2)以外のディレクトリ削除
for /f "skip=2" %%A in ('dir /AD /O-D /B') do RD /S /Q %%A

REM 指定した名前のディレクトリを再帰的に削除
REM for /R %%d in (フォルダ名) do RD /S /Q "%%d"
for /R %d in (.git) do RD /S /Q "%d"

REM ※バッチ処理の場合、変数はコマンドライン引数と区別するために%%Aのように%を2つ続けて記載
```

## 設定ファイル操作

```ini:config.ini
[IPアドレス]
IPADDRESS=10.20.30.40
[タイトル]
TITLE=タイトル
[ファイルパス]
FILE_PATH=C:\Users\wakasama\Desktop\text.txt
```

```sh:Setting.bat
for /f "tokens=1,* delims==" %%a in (config.ini) do (
    set %%a=%%b
)

echo %IPADDRESS%
echo %TITLE%
echo %FILE_PATH%
```

```txt:targetFolder.txt
C:\wakasama\Program
C:\wakasama\iso
```
```sh:Setting2.bat
REM バックアップ対象フォルダ読込
for /f %%a in (targetFolder.txt) do (
  rem 出力
  echo %%a
)
```

## ファイル情報表示
※オプション駆使すれば色々できそうだが...とりあえず下記で十分

```sh:fileList.bat
dir C:\Users\wakasama\Desktop  D:\test.ps1 | findstr "png ps1"
```

## 日時操作
◆バッチファイルでの日付取得（地域設定に依存しない）
　https://qiita.com/minorufujimoto/items/78f9da9fbff69d304cf4
　　※まさに探していたもの、簡単に実装できた

```sh:currentDateTime.bat
for /f %%a in ('wmic os get LocalDateTime ^| findstr \.') DO set LDT=%%a
set CUR_DATE=%LDT:~0,12%
```


## 色々...後で整理

```sh:atodeseiri.bat
REM .bat（バッチファイル）のifコマンド解説。
REM  http://qiita.com/sawa_tsuka/items/8edf3d3d33a0ae86cb5c

REM x86/x64分岐
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
    REM ★☆★x86の結果は要確認!!
    if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
        echo 32bit process on 64bit OS - WOW64
    ) else (
        REM IA64等の可能性有!!
        echo 32bit process on 32bit OS
    )
) else (
    echo 64bit process on 64bit OS
)

REM バッチ実行時の引数(%1～%9で取得可)


REM ディレクトリ/ファイル削除系
REM ★☆★既知のネタ要収集!!

REM ================================================================= Reminder

REM ※CドライブのJPEGデータを検索しDドライブにコピーする場合
REM for /f %%A in ('dir /b /s c:\*.jpg') do copy "%%A" d:\

REM -------------------------------
REM @ECHO OFF
REM 
REM SET keyword=bbb
REM 
REM REM 文字列検索
REM FINDSTR %keyword% sample.txt > NUL
REM GOTO answer%ERRORLEVEL%
REM GOTO :EOF
REM 
REM :answer0
REM REM 検索文字列ありの場合
REM ECHO %keyword%あり
REM GOTO :EOF
REM 
REM :answer1
REM REM 検索文字列無しの場合 or エラーが発生した場合
REM ECHO %keyword%なし
REM GOTO :EOF
REM -------------------------------

REM @echo off
REM 
REM REM 拡張子「.txt」のファイル名一覧を取得（サブディレクトリの中も再帰的に取得）
REM for /f "usebackq" %%i in (`dir /B /S *.txt`) do (
REM 
REM     REM ファイル名出力(改行割愛＋区切り文字挿入)
REM     SET /P<NUL=%%i:
REM 
REM     REM 行数出力
REM     type %%i | find /C /V ""
REM )
REM 
REM REM 動作確認用
REM pause

REM @Echo Off
REM ::----------------------------------------
REM :: 検索先フォルダ
REM Set SrcFolder="C:\"
REM ::----------------------------------------
REM :: 格納先フォルダ
REM Set DstFolder="E:\bbb\"
REM 
REM For /F "delims=" %%f IN ( E:\list.txt ) DO Call :MoveToMyFolder "%%f"
REM Exit /B
REM 
REM ::----------------------------------------
REM :: ファイルを探して移動
REM ::----------------------------------------
REM :MoveToMyFolder
REM CD /D %SrcFolder%
REM Echo %1 を検索します。
REM For /F "delims=" %%f IN ('dir /S /B %1') DO (
REM     Echo "%%f" を移動します。
REM     Move "%%f" %DstFolder% )
REM Exit /B
```

## 置換
```sh:replace.bat
echo off
set tikan1=りんご
set tikan2=みかん
echo 置換開始
setlocal enabledelayedexpansion
for /f "delims=" %%A in (C:\copy_base\hoge.txt) do (
    set line0=%%A
    set line1=!line0:copy_base1=%tikan1%!
    set line2=!line1:copy_base2=%tikan2%!
    echo !line2!>>C:\after\hoge.txt
)
endlocal
echo 置換完了
pause
```



## 配列
```sh:array.bat
REM カンマ区切りのデータを表示
@echo off
set color=red,blue,green,yellow,pink
for %%a in (%color%) do (
  echo %%a
)
```

## CSVファイルを先頭行のみ残すよう加工
```sh:oneLineFileCreate.bat
REM 事前準備
RD /S /Q D:\Batch\test
MD D:\Batch\test
XCOPY D:\Batch\work\test D:\Batch\test /E /H /Y

PUSHD D:\Batch\test

REM 特定ディレクトリ配下のCSVファイルのBOM削除
FOR /f "usebackq tokens=*" %%i in (`dir /B /S *.csv`) do (
  powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { $MyPath = '%%i';$MyFile = Get-Content $MyPath; $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False);[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)}"
)

REM 特定ディレクトリ配下のCSVファイルでループ
FOR /f "usebackq tokens=*" %%j in (`dir /B /S *.csv`) do (
  SET /P<NUL=%%j:
  CALL :cutOneLine "%%j"
)

POPD
EXIT /B

REM ファイル加工(1行目のみ残す)
:cutOneLine
FOR /f "usebackq tokens=*" %%a in (%1) do (
  SET HEAD=%%a
  GOTO :exit_for
)

:exit_for
echo %HEAD% > %1


@REM ◆バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版？)
@REM   https://archive.kerupani129.net/blog/posts/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92-1-%E8%A1%8C%E3%81%9A%E3%81%A4%E8%AA%AD%E3%81%BF/
```

### [参考サイト]
◆windowsの.batバッチファイルで文字列を置換する
　https://qiita.com/wagase/items/2180d8911dcc2a748fd3
　　※まさに探していたもの、簡単に実装できた（文字コードのケアまでしてました...助かる）
◆知識ゼロからのwindowsバッチファイル超入門
　https://jj-blues.com/cms/

# 規模測定(CLOC)
```sh:codeCount.bat
REM ------------------------------------------------------------------------
REM 環境変数
set CLOCPATH=D:\Angular\cloc-1.80.exe
set WORKPATH=D:\Angular

REM gitからコード取得
REM git clone -b ブランチ名 https://リポジトリのアドレス

REM 規模測定
%CLOCPATH% --skip-uniqueness %WORKPATH%\my-app\src %WORKPATH%\my-app2\src > clientResult.txt
%CLOCPATH% --skip-uniqueness %WORKPATH%\my-app3\src > clientResult2.txt
REM 参考サイト
REM   https://github.com/AlDanial/cloc
REM デバッグ用
REM %CLOCPATH% --by-file --skip-uniqueness %WORKPATH%\my-app\src %WORKPATH%\my-app2\src %WORKPATH%\my-app3\src

type clientResult.txt clientResult2.txt | findstr SUM: > codeSum.txt

REM codeSum.txtからスペースまで2列目(filesの合計)をaに格納,5列目(codeの合計)をbに格納
REM 遅延環境変数定義をすることで、CODEDATAに累積データが作成される
setlocal enabledelayedexpansion
set CODEDATA= 
for /f "tokens=2,5 delims= " %%a in (codeSum.txt) do (
set CODEDATA=%%a,%%b,!CODEDATA!
)
echo !CODEDATA! > codeCount.csv

REM ------------------------------------------------------------------------
```

# 7Zip関連

## 圧縮
C:\tools\7-zip\7za.exe a < ZIP名 > < 圧縮したいフォルダorファイル >
 a：圧縮コマンド（フォルダ構成反映）
 < ZIP名 >：指定したフォルダを圧縮した際の名前
 < 圧縮したいフォルダorファイル >：圧縮したいフォルダorファイル名

## 解凍
C:\tools\7-zip\7za.exe e -y -o< 出力先パス > -ir!< 取り出したいファイル名 > < ZIP名 > 
        e：解凍コマンド（フォルダ構成反映なし）
       -y：Yes/Noは全部Yes
       -o：このオプションに続けてスペースを空けずに<出力先パス>記入
< ZIP名 >：フォルダごと圧縮したZIPファイルを指定


# さくらエディタ関連

## クリッカブルURL
/(\b[a-zA-Z]:\\|\B\\\\)[\w\-_.\\\/$%~]*[^"\r\n]*/k
/(\b[a-zA-Z]:\\|\B\\\\|\bfile:\/\/)[\w\-_.\\\/$%~]*[^"\r\n]*/k

##さくらエディタ検索/置換
```sh:searchReplace.bat
REM ------------------------------------------------------------------------
REM 環境変数　※環境に応じて要変更
SET SAKURAPATH="C:\Program Files (x86)\sakura\sakura.exe"


REM Grepに関するオプション(-GREPMODE と同時に指定します)
REM  -GREPMODE Grep実行モードで起動 
REM  -GKEY= Grepの検索条件
REM         "'で囲む。条件中の'"'は二つの連続した'"'にする
REM         (例) -GKEY="printf("        「printf(」を検索
REM         (例) -GKEY="printf( ""%s"    「printf( "%s」を検索 
SET SAKURAGKEY=-GKEY="wakasama"

REM  -GREPR= Grepの置換文字列 (sakura:2.2.0.0以降)
REM          これを指定すると置換になる
REM          '"'で囲む。条件中の'"'は二つの連続した'"'にする 


REM  -GFILE= Grepの検索対象のファイル
REM          '"'で囲む。条件中の'"'は二つの連続した'"'にする 
SET SAKURAGFILE=-GFILE="*.txt"

REM  -GFOLDER= Grepの検索対象のフォルダ
REM            '"'で囲む。条件中の'"'は二つの連続した'"'にする 
SET SAKURAGFOLDER=-GFOLDER="D:\Share"


REM  -GREPDLG サクラエディタが起動すると同時にGrepダイアログを表示します。
REM  -GCODE= Grepでの文字コードを指定します。
REM          (未指定,0=SJIS、1=JIS、2=EUC、3=Unicode、4=UTF-8、99=自動選択)
SET SAKURAGCODE=-GCODE=99

REM  -CODEと同じように数字で指定します。 
REM  -GOPT= [S][L][R][P][W][1|2|3][K][F][B][G][X][C][O][U][H] 
REM   -GOPTのオプション
REM    S     サブフォルダからも検索 
REM    L     大文字と小文字を区別 
REM    R     正規表現 
REM    P     該当行を出力／未指定時は該当部分だけ出力 
REM    W     単語単位で探す 
REM    1|2|3 結果出力形式。1か2か3のどれかを指定します。
REM          (1=ノーマル、2=ファイル毎、3=結果のみ) 
REM    K     -GCODE=99と同じ意味です。互換性のためだけに残されています。 
REM    F     ファイル毎最初のみ 
REM    B     ベースフォルダ表示 
REM    G     フォルダ毎に表示 
REM    X     Grep実行後カレントディレクトリを移動しない 
REM    C     (置換)クリップボードから貼り付け (sakura:2.2.0.0以降) 
REM    0     (置換)バックアップ作成 (sakura:2.2.0.0以降) 
REM    U     標準出力に出力し、Grep画面にデータを表示しない
REM          コマンドラインからパイプやリダイレクトを指定することで結果を利用できます。(sakura:2.2.0.0以降) 
REM    H     ヘッダ・フッタを出力しない(sakura:2.2.0.0以降) 
SET SAKURAGOPT="-GOPT=SPU"

REM 検索
%SAKURAPATH% -GREPMODE %SAKURAGKEY% %SAKURAGFILE% %SAKURAGFOLDER% %SAKURAGCODE% %SAKURAGOPT% > result.txt

REM 置換
REM SET SAKURAGFOLDER=-GFOLDER="D:\Share\CmdSearch\test"
REM SET SAKURAGKEY=-GKEY="葛飾区"
REM SET SAKURAGREPR=-GREPR="品川区"
REM SET SAKURAGOPT="-GOPT=SPOU"
%SAKURAPATH% -GREPMODE %SAKURAGKEY% %SAKURAGREPR% %SAKURAGFILE% %SAKURAGFOLDER% %SAKURAGCODE% %SAKURAGOPT% > result.txt
REM ------------------------------------------------------------------------
```
# Oracle関連
※参考サイト
◆バッチシェルからSQLを実行して終了コードを返す
　https://qiita.com/kariyaitaru/items/e3c064786a90d2964069