■Windowsバッチレシピカテゴリ
- 【Windows】指定したフォルダ以下のすべてのhoge.logファイルをタイムスタンプ付きで一覧表示
- 【JP1/AJS】AJSROOT1環境のジョブグループ JG1 にある Cal1 へ、当日から3日間の日付を登録する処理
- 同じフォルダ内の A_01.txt と A_02.txt を比較して、結果を A_result.txt に記録する簡単な差分チェックツール
- 【Windows】コマンドプロンプトで変数内の文字を爆速置換・削除する裏ワザ(環境変数の文字列置換)
- 「CSVファイルを1行ずつ読み込んで、カンマ区切りで要素を分解して処理する(while read 構文)」を、Windowsのバッチファイル(.bat)で再現する方法
- 【Ask_AI】(複数フォルダ対応版)PowerShellを使って、日付フォルダ内のファイルの中から特定の文字列を含むファイルを検索し、結果を日付付きのファイルに出力するスクリプト
- 【Ask_AI】バッチの最初にウェイトを入れる
- 【PowerShell】文字列の中で変数を並べて表示する正しい書き方(波括弧 {} の使い方)
- PowerShellを使って、日付フォルダ内のファイルの中から特定の文字列を含むファイルを検索し、結果を日付付きのファイルに出力するスクリプト【Ask_AI】
- 【Ask_AI】Windowsで本日取得したスナップショットをExcelのシートに縦に古い順から貼り付けていくスクリプト
- Windowsバッチファイルで、第一引数にファイル名、第二引数にフォルダパスを受け取り、そのファイルが指定フォルダ内に存在するかを判定するスクリプト【Ask_AI】
- WinSCPスクリプト
- 【Ask_AI】PowerShellでサイズの大きいフォルダのリストを作る
- 【Ask_AI】powershellでキーワードマッチした行とその下の行を出力する
- Windowsで複数のテキストファイルを結合して1つのファイルにする
- 一桁時間台のtimeの結果から半角スペースを0に置換(0で穴埋め)して格納する
- ネットワークドライブを接続、任意のフォルダ内でリストに書かれた、複数の任意の文字列を含むファイルを取得してネットワークドライブを切断
- 任意のフォルダ内のファイルで〇日前以降や〇時間前以降のファイルのみ別フォルダにコピーする ただしtmpフォルダは除く
- xcopy
- 複数のフォルダそれぞれの中にある、任意の文字列が含まれているファイルをフォルダごとコピーする
■Linuxバッチレシピカテゴリ
- 「CSVファイルを1行ずつ読み込んで、カンマ区切りで要素を分解して処理する(while read 構文)」を、Windowsのバッチファイル(.bat)で再現する方法
- 【Ask_AI】Apacheが5回失敗(ダウン)した際に自動で再起動させる設定手順
- 【Ask_AI】date –date “1 days ago” “+%d” は正しい書式ですか
- サイトのRSSを取得できなかったらHTMLを吐かずにエラーコードを出力して失敗、取得成功してさらに取得したRSSのサイズが0より大きかったら後続のコマンドを実行する
- コマンドの結果を標準出力に出しつつファイルにも出力して結果をその場で目視でも確認できるようにする
- bashあれこれ
- zgrepでZIP圧縮されたファイルで7日前の月のYYYYMMを含むファイルからキーワードを含む行を抽出する
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
スクリプトを実行しようとすると、このシステムではスクリプトの実行が無効になっているため・・・と出るとき
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"`'