【dosbatch】バッチファイルのサンプル集

バッチファイルのサンプル集

必要に迫られて作成したバッチファイルです。
ただ、今にして思えば PowerShell を使う方が効率的かと思います。
 

 

サーバの公開フォルダをマウントする

  • ネットワークドライブ X: として、\\any.server\share\project\releaseData\v1.00 をマウントする。
  • アカウントは neko、パスワードを password とする
  • マウント前に一旦接続を切る (net user X: /delete /Y)
net use
sleep 2
net use X: /delete /Y
net use X: \\any.server\share\project\releaseData\v1.00 /user:neko password

 

PowerShell スクリプトを呼び出す

"C:\work\a.ps1" として置かれている ps1 スクリプトを実行する。

@ECHO OFF
powershell -NoProfile -ExecutionPolicy Unrestricted "C:\work\a.ps1"

 

BatchFiles\A.exe を実行する

BatchFiles フォルダの有無をチェックしてから、A.exe を実行する。
なお、sleep が無い場合に備えて ping で代用している。

@ECHO OFF

set "productID=712345"
set "seqNo=13"
set "waitTime=3"

if exist BatchFiles cd BatchFiles

.\A.exe -n %seqNo% -p %productID%

echo Wait for %waitTime%s
ping 127.0.0.1 -n %waitTime% > NUL

 

BatchFile\B.bat を実行する

start BatchFile\B.bat

 

Python プロセスを kill する

TASKKILL /F /IM "Python.exe"

 
 

Python.exe を停止する

ループを使って停止処理を呼び出す。

@ECHO OFF

:LOOP
tasklist | find /i "python.exe" >nul 2>&1
IF ERRORLEVEL 1 (
  ECHO python does not exists
  GOTO ENDLOOP
) ELSE (
  ECHO python is still running
  TASKKILL /F /IM "python.exe"
  Timeout /T 2 /Nobreak
  GOTO LOOP
)

:ENDLOOP
exit

 

同名のプロセスが存在する場合に絞り込んで Kill する

  • PowerShell のうち、ウィンドウタイトルが「OleMainThreadWndName」となっている PowerShell を削除する。
  • for /f "tokens=1,2,10" %%a という記述が awk '{print $1,$2,$10}' に相当する。
  • if文の名で変数を ! で括っているのは遅延評価の結果を取り出すためである。*1
イメージ名           PID セッション名   セッション#  メモリ使用量  状態      ユーザー名  CPU 時間  ウィンドウ タイトル                                      
================ ====== ============= =========== ============ ======== =========== ======== =========================================================
System                4 Services                0     12,096 K Unknown  N/A          0:07:02 N/A                                                      
略

powershell.exe    11796 Console                 1     48,456 K Running  Neko         0:00:00 C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
WmiPrvSE.exe       6620 Services                0     11,424 K Unknown  N/A          0:00:02 N/A
powershell.exe     2432 Console                 1     48,488 K Running  Neko         0:00:00 OleMainThreadWndName
@setlocal enabledelayedexpansion

@for /f "tokens=1,2,10" %%a in ('tasklist /v') do @(
  @rem echo %%a,%%b,%%c
  @set TARGET=powershell.exe
  @set INAME=%%a
  @set PID=%%b
  @set WTITLE=%%c
  @if /i !INAME!==!TARGET! @(
    @ECHO.!WTITLE! | FIND /I "OleMainThreadWndName" >Nul && (
      @rem  @echo !TARGET!
      @rem  @echo !PID!
      @echo !PID!
      taskkill /PID !PID!
    )
  )
)

  
ちなみにこの処理を PowerShell で書くと次のようになる。

$TPID = Get-Process powershell | `
        Select-Object Id,MainWindowTitle | ? { $_.mainWindowTitle -match "Olemainthreadwndname" } |`
        Select-Object Id                 | Out-String -Stream | ? { $_ -match "[0-9].+" }

Stop-Process -id $TPID 

 

バッチ終了時に起動したプロンプトウインドウを閉じる

exit /B

 

ping を使って所定の秒数だけ待機する

  • sleep, timeout は次の問題がある。
    • sleep はデフォルトで存在しない。
    • また、timeout はカウントダウン中にキーを入力するとカウントが停止してしまう。
@ping 127.0.0.1 -n 11 > nul

*1:%PID% としても PID と表示されるだけ