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

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

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

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

Q&A

解決済

1回答

2245閲覧

"more"の結果をファイルにリダイレクトしてもファイルに何も書き込まれない

thumpx3

総合スコア10

Windows

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

0グッド

0クリップ

投稿2019/07/12 08:40

【事象】
あるログファイル内の1年以上前のタイムスタンプが書かれている行を削除するため、以下のようなバッチファイルを作成しました。

  1. 番号リスト日付が昇順に並んだログファイルを上から1行ずつ読み込み
  2. 番号リスト1年前のタイムスタンプを見つけたら、その行以降をmoreで同じログファイルににリダイレクトして上書き→結果として1年以上前のタイムスタンプが書かれている行が削除される
set YEAR=%date:~-10,4% set /a LASTYEAR=%YEAR%-1 set TIMESTAMP=%LASTYEAR%/%date:~-5,2%/%date:~-2,2% set DELETELINE=0 set INPUT_FILE=<ログファイル名> setlocal enabledelayedexpansion for /f "delims=" %%a in (%INPUT_FILE%) do ( set line=%%a echo !line! | findstr !TIMESTAMP! >NUL if !errorlevel! == 0 ( rem 一年前のタイムスタンプが存在する行より上の行を削除 more +!DELETELINE! !INPUT_FILE! > !INPUT_FILE! exit 0 ) set /a DELETELINE=DELETELINE+1 )

しかし上記を実行したところ、上書きしたログファイルに何も書き込まれず、空ファイルになってしまいました。

【試したこと】

  • "more"の1行のみをコマンドプロンプトで手動実行→成功
  • "more"の結果を">"での上書きではなく、">>"で追記→成功。ログの末尾に一年以内のログが追記された
  • 読み込んだログファイルと別のログファイルに"more"の結果をリダイレクト→成功

【質問】

  • なぜ">"で読み込んだファイルへリダイレクトした場合のみ、空ファイルになってしまうのでしょうか?
  • どうすれば意図した通りの結果が得られるのでしょうか?

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜ">"で読み込んだファイルへリダイレクトした場合のみ、空ファイルになってしまうのでしょうか?

リダイレクトで書き出すためにシェルが新規作成としてファイルを開き内容がクリアされますので、その後にmoreコマンドがファイルを見たときには、もう内容はありません。

どうすれば意図した通りの結果が得られるのでしょうか?

いったん別なファイルに結果を書き出してから、結果ファイルで上書きする、というような処理が必要かと思います。

投稿2019/07/12 08:47

編集2019/07/12 08:48
maisumakun

総合スコア145184

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

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

thumpx3

2019/07/12 09:34

別ファイルに一旦出力する必要があるのですね…そのような気がしていたのですがなぜこのような事象が起こるのかわからないままなのは気持ち悪かったのでスッキリしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問