Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

私的ITチートシート_バッチ作成レシピ(2025/10/10更新)

■Windowsバッチレシピカテゴリ

■Linuxバッチレシピカテゴリ

PowerShell

Windowsのコマンドで〇月〇日(西暦いらない)を表示する

CMDで見つからなかったので、そんな時はPowerShellで。

Get-Date -Format M

もしくは

    
Get-Date -Format MM月dd日

copy-itemの上書き保存とフォルダごとコピー

※ファイルであれば基本的にデフォルト上書きだが、フォルダはそのままでは上書きされない
※UNC表記可
■ファイルコピー
copy-item コピー元ファイル コピー先ファイル
■フォルダコピー
copy-item コピー元フォルダ コピー先フォルダ -Recurse
■フォルダごと強制上書き
copy-item コピー元フォルダ コピー先フォルダ -Recurse -Force

スクリプトを実行しようとすると、このシステムではスクリプトの実行が無効になっているため・・・と出るとき

コマンドプロンプトを「管理者権限」で起動
ps1スクリプトの実行を許可する
PowerShell -ExecutionPolicy RemoteSigned sample.ps1

システム全体でps1スクリプトの実行を許可する

PowerShell Set-ExecutionPolicy RemoteSigned

Windowsバッチ


タスクスケジューラでタスクを複数回実行する

繰り返し間隔と継続時間を設定する

開始時間+継続時間内で繰り返し間隔でジョブが実行されるため、別の時間帯のジョブを別で作成することなく、1つのタスクで日の実行回数を制御可能

 

バッチの引数に絶対パスのファイルを与える時のダブルクォーテーションのあるなし

絶対パスだと長い引数になりますが、ダブルクォーテーションのあるなしどちらでも問題ありませんでした。もちろん空白は入れない方がよいでしょうが。

バッチの中からvbsを起動

バッチファイルの中で以下のように記述

cscript hoge.vbs

日付の〇年、〇月、〇日部分のみを取得する

年部分 %date:~0,4%
月部分 %date:~5,2%
日部分 %date:~8,2%

〇月22日に22.logというログファイルを生成する時に当日生成されたファイルをtmpフォルダ配下にコピーする例

copy %date:~8,2%.log tmp

1行目が見出しとなっているカンマ区切りCSVから1列目~3列目までを別CSVファイルにエクスポートする(PowerShel)

importの方だけ-Encoding付けたら出力ファイルが文字化け。import,export両方Encoding付けておくと文字化けしなかった。

import-csv "抽出元CSVファイルパス" -Encoding default -Delimiter ","|select "見出し1","見出し2","見出し3"|export-csv "抽出後出力先CSVファイルパス" -Encoding Default

dirの出力をファイルの大きい順に並び変え

dir /o-s

「-」はソート順反転の意味

findstrで複数のtxtファイルから「A FAILED」を含む文字列を抽出する

これではだめ A or FAILEDを探してしまう

findstr "A FAILED" *.txt

「 」(空白)として見てほしければエスケープしませう。

findstr "A\ FAILED" *.txt

findstrで複数のtxtファイルから「-S」を含む文字列を抽出する

「-」はエスケープしませう。

findstr "\-S " *.txt

dirのサブフォルダ含む、パス+ファイル名のみ表示、特定の拡張子

dir /s /b *txt

PowerShellで「tail -f」のようなことをする

get-content c:\path\to\sample.txt -wait -tail 10

必要であれば末尾に以下のように付けてEncoding
 -Encoding UTF8
Get-Content -Wait -Tail 10 -Path "ファイルへのパス"

ファイル名変数取得

ドラッグファイル(一番目の引数)格納用変数

%1

ファイル名の拡張子前までを取得

fname=%~n1

ファイル名の拡張子を取得

kakuchosi=%~x1

バッチファイルの格納先ディレクトリパスを取得

dirpath=%~dp0

上記を組み合わせて何か変換をかけたいファイルをドラッグして変換後、別名で保存したい時など
例)CRLFをLFに変換して別名保存

%dirpath%nkf.exe -0Lu %1 %dirpath%\%fname%_LF%kakuchosi%

Whereコマンドでフォルダ配下のファイルをサブフォルダも含めタイムスタンプとファイルサイズをすっきりと一覧表示する

カレントのファイルすべて

where /R . * /T 

ファルダ配下の拡張子を持つファイル

where /R フォルダ *.* /T

実行例
C:\Users\hoge>where /R Pictures * /T
124133 2022/05/18 17:42:22 C:\Users\hoge\Pictures\x206434.jpg
101943 2022/05/16 11:22:20 C:\Users\hoge\Pictures\x214691.jpg
101653 2022/05/16 11:22:04 C:\Users\hoge\Pictures\x214691.png
314441 2022/05/18 0:26:00 C:\Users\hoge\Pictures\x234390.jpg

日付変数(YYYYMMDD)

%date:/=%

日付変数日付(YYYYMM)

%date:~0,4%%date:~5,2%

今日日付(バッチ内PowerShell使用)

FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.ToString"("'yyyyMMdd'")"`) DO SET today=%a

FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.ToString"("'yyyy/MM/dd'")"`) DO SET today=%a

過去未来日付(バッチ内PowerShell使用)

YYYYMMDD形式(1日前)
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddDays"("-1")".ToString"("'yyyyMMdd'")"`) DO SET yesterday=%%a

以降、使用したい箇所で%yesterday%で使用可能

YYYYMMDD形式(1日後)
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddDays"("+1")".ToString"("'yyyyMMdd'")"`) DO SET tomorrow=%%a
YYYYMM形式(100日前)
FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.AddDays"("-100")".ToString"("'yyyyMM'")"`) DO SET yesterday=%a
YYYY/MM/DD形式(1日後)
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddDays"("+1")".ToString"("'yyyy/MM/dd'")"`) DO SET tomorrow=%%a
ちなみに「/」はファイル名やフォルダ名には使えないので
フォルダやファイル名に使えるものも欲しければ、
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddDays"("+1")".ToString"("'yyyy/MM/dd'")"`) DO SET tomorrow=%%a 
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddDays"("+1")".ToString"("'yyyyMMdd'")"`) DO SET tomorrow1=%%a 
みたいな「/」なしのものを一緒に作っておいて、使用する。

例えば「YYYY/MM/DD」があるものを抽出するが、結果のファイル名では「YYYYMMDD」をファイル名に付けるとか。
findstr "SUCCESS" c:\hoge.txt|findstr "%tomorrow%" > c:\%tomorrow1%_result.txt
DD形式で変数に格納し、利用する
9/5に実行した場合

FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.AddDays"("-1")".ToString"("'dd'")"`) DO SET yesterday1=%a
FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.AddDays"("-2")".ToString"("'dd'")"`) DO SET yesterday2=%a
FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.AddDays"("-3")".ToString"("'dd'")"`) DO SET yesterday3=%a
FOR /F "usebackq" %a IN (`powershell [DateTime]::Today.AddDays"("-10")".ToString"("'dd'")"`) DO SET yesterday4=%a

echo %yesterday1%
04
echo %yesterday2%
03
echo %yesterday3%
02
echo %yesterday4%
26

こんな感じで使う(昨日のdd.logがある時)
copy c:\hoge\%yesterday1%.log c:\hoge\hoge\


先月のYYYYMM(コマンドラインの中でPowerShellを実行)

バッチファイルの中で使う場合は「%」を2つにする。コマンドラインで直接実行は%は1つでよい。

FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddMonths"("-1")".ToString"("'yyyyMM'")"`) DO SET lastmonth=%%a


来月のYYYYMM(コマンドラインの中でPowerShellを実行)

+1で翌月、年、月を入れたフォーマットも可能 
FOR /F "usebackq" %%a IN (`powershell [DateTime]::Today.AddMonths"("+1")".ToString"("'yyyy年MM月'")"`) DO SET nextmonth=%%a

 

PowerShellが使えないWindowsは撲滅希望(笑)

findstr

■A or B
findstr "A B" sample.txt

■A and B
findstr "A" sample.txt|findstr "B"

■空白を含む
findstr /C:"A B" sample.txt

copyで条件に合うファイルを連結コピー

copy /b *.log 連結コピー後ファイル名

Linuxシェルスクリプト


ls -laで複数のファイルを指定する

/root/work配下に以下のようなファイルがあり、それを一度にls -la するには
abc ehg hij0 hij1 hij2 hij3 hij4 hij5 hij6 klm1 klm2

ls -la /root/work/{abc,ehg,hij[0-6],klm[12]}

とすると以下のような感じで出力されます。

-rw-r--r--. 1 root root 0 12月 29 13:52 /root/work/abc
-rw-r--r--. 1 root root 0 12月 29 13:52 /root/work/ehg
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij0
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij1
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij2
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij3
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij4
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij5
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/hij6
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/klm1
-rw-r--r--. 1 root root 0 12月 29 13:53 /root/work/klm2

{A,B,C} A or B or C のいずれかにマッチ
[0-6]0,1,2,3,4,5,6のいずれかにマッチ
[12]1,2のいずれかにマッチ

ファイルの有無を一度に確認する時に便利。

日付変数(Linux)

YYYYMMDD
date '+%Y%m%d'
YYYYMMDDHHMM
date "+%Y%m%d%H%M"
YYYY/MM/DD
date "+%Y/%m/%d"
一日前のYYYYMMDD,YYYY/MM/DD
date +%Y%m%d --date '1 day ago'
date +%Y/%m/%d --date '1 day ago'
一か月前のYYYYMM
date -d '1 month ago' +%Y%m
20日後のyyyy/mm
date --date "20 days" "+%Y/%m"

 

Teratermマクロ

Teratermマクロコマンド

ネットマネーラボ
getpassword パスワードファイル ユーザーネーム パスワード →パスワード取得
connect ホスト名 →ホストへ接続
strconcat 変数 '任意の文字列' →変数と'文字列’を連結して変数に格納する
pause 数字 →数字秒停止
sendln '任意のLinuxコマンド' →任意のLinuxコマンドを接続先で実行する
unlink →メニュー表示するLinuxコマンドを実行させたあとマクロを解除して、ウィンドウの制御をしなくする
wait 'word' ⇒指定した語句が返ってくるまで待つ
showtt 0 ⇒Teratermの画面を最小化する 表示が長い場合は最小化した方が圧倒的に速い
showtt 6 ⇒ログ取得中にログウィンドウ画面を隠す

ファイル送信

送信元ファイル、送信先ファイルをそれぞれ定義し、scpsendで送信

SOURFILE = 'C:\Path\to\file' (ネットワークのUNCパス「\\」でもOK)
DESTFILE = '/Path/to/File' (Linuxの配置したいファイル名の絶対パス)

scpsend SOURFILE DESTFILE

XXX.logから「AA一文字以上の繰り返し5回BB」かつOK]YYYYMMDDを抽出する

sendln 'grep "AA.....BB" /home/hoge/grep.txt |grep OK]`date +"%Y/%m/%d"`'

 

タイトルとURLをコピーしました