特定月のログを削除する。DOSコマンドを作成したのですが旨く削除されません。
アドバイスをお願いします。
set timestp = %2010/03%
for %a in ( c:\logs ) do set fdate=%~ta (
set fdate=%fdate:~0,7%
rem 削除処理
if %fdate:~-7%==%timestp% del %a ← ★
)
★の処理で対象月のファイルを削除しようとしているのですが
実際には削除処理が実行されている形跡がなりません・・・
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
いくつか指摘点があります。
>set timestp = %2010/03%
これは変数にセットする値なので 2010/03 ですよね。
(%%は不要)
>c:\logs
これだと取得できるのは、c:\logsディレクトリ自体のタイムスタンプになります。
logs内のログファイルをループして処理したいのであれば、
c:\logs\*
にする必要があると思います。
それと、カッコ内のコマンドをFORによってループさせるのであれば、左カッコの位置が違います。
doの後ろに左カッコが必要です。
以上を鑑み、バッチの中はこうなります。
(バッチで試したので %a → %%a 、%~ta → %%~taで記述しています)
↓
@echo off
set timestp=2010/03
for %%a in ( C:\logs\* ) do (
set fdate=%%~ta
set fdate=%fdate:~0,7%
rem DEBUG
echo target_ts:%timestp%
echo target_file_path:%%a
echo target_file_ts:%fdate%
rem 削除処理
if "%fdate:~-7%" == "%timestp%" del "%%a"
)
No.2
- 回答日時:
No.1さんの指摘と重複しますが
・変数に代入する値を%で囲む必要はありません。
・set timestp = %2010/03% のように = の前後に空白を入れると、その空白を含んだ変数名に代入されてしまいます。
・バッチでfor文の変数を記述するときは%%aのように%を2つ重ねて記述します。
・%fdate:~-7% は単に%fdate%でいいのでは(その前に先頭から7文字取り出しています)
また、No.1さんの指摘したfor文のファイルの指定については同意見で、c:\logsの中にログファイルが複数あると解釈しました。
ただ、No.1さんの例示した内容でも上手く動きません。
for文のループで実行する内容を( )でくくって複文とした場合、()内の環境変数はfor文が実行された時点で展開(中身の値に置き換え)されます。
したがって、set fdate=%fdate:~0,7% や %fdate:~-7%などの記述はすべて、for文が実行された時点の値(つまり空)になってしまうため意図どおりには変換されません。
(set /? のヘルプに説明があります)
ループ内で値の変化を反映させるためには、環境変数の遅延展開を使用するか、CALL文に引数を渡してサブルーチンで処理させるのが定番です。
以下に CALL 文での記述例を示します。
CALL文の引数には %%~fa でファイルのフルパスを渡しています。
サブルーチン側では、%1 がファイルのフルパス、%~t1がタイムスタンプになります。
Windows XP で確認しました。
:------------------------------------------------ sample.bat
echo off
set timestp=2010/03
for %%a in ( c:\logs\* ) do call :sub "%%~fa"
exit /b
:sub
set fdate=%~t1
if "%fdate:~0,7%"=="%timestp%" del %1
goto :EOF
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) Excel VBA シートを追加後に余分なシートを削除する、の意味 21 2022/05/19 22:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチでテキストファイルから...
-
コマンドプロンプト標準出力と...
-
VBアプリケーションで終了コー...
-
絶対パス名からファイル名を取...
-
DOSバッチでUNIXテキストファイ...
-
バッチファイルでDirで取得した...
-
C#でメジャーなバッチフレーム...
-
コマンドプロンプト画面の閉じ...
-
IPアドレスの第3オクテットだ...
-
Kシェルでgotoのような処理を作...
-
コマンドプロンプトで2ヶ月前3...
-
バッチファイルの環境変数を別...
-
WinMailCmdのバッチファイルに...
-
バッチファイルで昨日の日付を取得
-
バッチファイルで常に最新の現...
-
バッチファイル IF 複数条件方法
-
コマンドプロンプトでファイル...
-
vbscriptでのチェックデジット...
-
DOSのバッチで、テキストファイ...
-
BATのIF文について質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチでテキストファイルから...
-
コマンドプロンプト標準出力と...
-
バッチファイルで昨日の日付を取得
-
バッチファイルでDirで取得した...
-
コマンドプロンプトで2ヶ月前3...
-
コマンドプロンプト(バッチファ...
-
絶対パス名からファイル名を取...
-
VBアプリケーションで終了コー...
-
子バッチ内のキー入力処理へ自...
-
コマンドプロンプトでファイル...
-
バッチファイルで常に最新の現...
-
コマンドプロンプト画面の閉じ...
-
コマンドプロンプト(バッチ)...
-
batの変数を直接vbsのプログラ...
-
バッチファイル テキストファイ...
-
呼び出し元バッチを知るには?
-
PowerShellからPowerShellを呼...
-
DOSのバッチで、テキストファイ...
-
telnetの自動シェルバッチを作...
-
Kシェルでgotoのような処理を作...
おすすめ情報