質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

3回答

5090閲覧

バッチで当月日付のついたファイルのみ処理をしたい

work307

総合スコア14

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2018/09/09 13:24

以下のように任意のディレクトリにあるファイルで当月のついたものだけ抽出、その後し加工を行いたいと考えています。

c:\test test_1000_201807.db test_2000_201807.db test_1000_201808.db test_2000_201808.db test_1000_201809.db test_2000_201809.db

処理をする月が2018年9月の場合、ファイル名に201809のものだけ抽出し、順番に処理を行いたいです。

以下のようにfor文でバッチを書きましたが、ファイルが1つしか抽出されません。

test.abt

1@echo off 2set WORK_DIR=C:\test 3set COPY_DIR=%WORK_DIR%\temp 4set LOG=%WORK_DIR%\test.log 5 6call :LOG "*** 処理開始 ... ***" 7for /F "tokens=1* delims=" %%a in ('dir /b /O:D %WORK_DIR%*.db') do set filename=%%a 8copy "%filename%" %COPY_DIR% 9sqlite3 %filename% < test.query >> test_%filename%.csv 10) 11call :LOG "*** 処理終了 ... ***" 12:LOG 13echo %DATE%-%TIME% %~1>>%LOG%

どのようにすれば抽出したファイルを順番に変換することができますでしょうか。
知見が無く困っております。大変恐縮ですが、皆さんのお知恵を貸していただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

for文のところはこれでいいのでは?

set t=%date:~0,4%%date:~5,2% for %%f in (%WORK_DIR%*%t%.db) do ( echo %%f )

投稿2018/09/09 13:55

編集2018/09/09 13:58
YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

work307

2018/09/09 14:33

回答ありがとうございます。 *201809.dbが抽出されてしまい該当するファイルが抽出できません。 以下の2ファイルを抽出してCSV変換したいのですが他に方法はありますでしょうか。 test_1000_201809.db test_2000_201809.db
YAmaGNZ

2018/09/09 15:00

そのファイルの他に何のファイルが抽出されているのですか? 例に挙げられているファイル名の他に*201809.dbにマッチするファイル名が存在するということですか?
work307

2018/09/09 15:09

申し訳ありませんこちらのミスでした。 問題なく表示できました。
guest

0

ベストアンサー

質問のコードだと、そもそも、年月で抽出していませんが?

CMD

1@echo off 2set WORK_DIR=C:\test 3set COPY_DIR=%WORK_DIR%\temp 4set LOG=%WORK_DIR%\test.log 5set YYYYMM=%DATE:~0,4%%DATE:~5,2% 6 7call :LOG "*** 処理開始 ... ***" 8for /F "delims=" %%a in ('dir /b /O:D %WORK_DIR%*%YYYYMM%.db') do call :EXEC %%a 9call :LOG "*** 処理終了 ... ***" 10goto :EOF 11:LOG 12echo %DATE%-%TIME% %~1>>%LOG% 13goto :EOF 14:EXEC 15set filename=%1 16copy "%filename%" %COPY_DIR% 17sqlite3 %filename% < test.query >> test_%filename%.csv 18goto :EOF

#追記
普通はこうか。

CMD

1@echo off 2set WORK_DIR=C:\test 3set COPY_DIR=%WORK_DIR%\temp 4set LOG=%WORK_DIR%\test.log 5set YYYYMM=%DATE:~0,4%%DATE:~5,2% 6 7call :LOG "*** 処理開始 ... ***" 8for /F "delims=" %%a in ('dir /b /O:D %WORK_DIR%*%YYYYMM%.db') do ( 9 copy %WORK_DIR%\%%a %COPY_DIR% 10 sqlite3 %WORK_DIR%\%%a < test.query >> test_%%a.csv 11) 12call :LOG "*** 処理終了 ... ***" 13goto :EOF 14:LOG 15echo %DATE%-%TIME% %~1>>%LOG% 16goto :EOF

投稿2018/09/09 13:36

編集2018/09/09 14:41
otn

総合スコア84531

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

work307

2018/09/09 14:33

回答ありがとうございます。 *201809.dbが抽出されてしまい該当するファイルが抽出できません。 以下の2ファイルを抽出してCSV変換したいのですが他に方法はありますでしょうか。 test_1000_201809.db test_2000_201809.db
otn

2018/09/09 14:45

> *201809.dbが抽出されてしまい該当するファイルが抽出できません。 とは、具体的にどんな現象でしょうか?
work307

2018/09/09 15:09

申し訳ありません。こちらのミスでした。 追記していただいた内容で当月の日付のファイルが抽出できました。 質問ばかりで申し訳ありませんが、201808のファイルだけ抽出したい場合はどのように記述を行えば宜しいでしょうか。 SETを以下のように指定しましたが、今度はすべてのファイルが表示されるようになってしまいました。 ```SET set YYYYMM=%DATE:~0,4%%DATE:~5,2% set /TEST dd=%YYYYMM%-1 ```
otn

2018/09/09 15:13

??2行目のSETは、どういうつもりですか?エラーになりませんか? > 201808のファイルだけ抽出したい場合 set YYYYMM=201808
work307

2018/09/09 15:26

はい。エラーになります。 当月日付201809からマイナス1したもの201808で抽出したいのですが上手くいきません。
otn

2018/09/09 15:31

年またぎがあるので、1文では無理ですね。計算は set /a です。 set YYYYMM=%DATE:~0,4%%DATE:~5,2% set /a YYYYMM-=1 if %YYYYMM:~4,2% == 00 set /a YYYYMM=YYYYMM-100+12
work307

2018/09/09 15:38

ありがとうございます。 目的のファイル名が抽出できました。
work307

2018/09/09 15:42

if %YYYYMM:~4,2% == 00 set /a YYYYMM=YYYYMM-100+12 ↑ この部分が全く理解できないのが恥ずかしいです。
otn

2018/09/09 15:46

考えれば分かるレベルなので、考えてください。 %YYYYMM:~4,2% は、5文字目から2文字、つまり月の部分です。
work307

2018/09/10 00:00

ありがとうございます。
guest

0

BAT など不要。
そう、PowerShell 芸ならね!

PowerShell

1$WORK_DIR = 'C:\test' 2$COPY_DIR = "$WORK_DIR\temp" 3$LOG = "$WORK_DIR\test.log" 4 5function Log 6{ 7 Param([String] $Message) 8 $time = [DateTime]::Now.ToString("yyyy-MM-dd hh:mm:ss") 9 "$time $Message" >> $LOG 10} 11 12Log "*** 処理開始 ***" 13 14$mon = [DateTime]::Today.ToString("yyyyMM") 15Get-ChildItem *_$mon.db | ForEach-Object { 16 Copy-Item $_ $COPY_DIR 17 Get-Content test.query | sqlite3 $_ >> test_$_.csv 18} 19 20Log "*** 処理終了 ***"

投稿2018/09/09 14:58

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

work307

2018/09/09 23:59

ありがとうございます。 PowerSlellとても勉強になります。
Zuishin

2018/09/10 00:04

これはほぼ冗談の回答ですが、bat より強力で扱いやすいので、本気で移行を考える価値はあります。 bat を使い続けるのであれば、他に C++ など exe を作れるものや Python などのスクリプト言語を扱える能力が必要となると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問