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

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

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

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

バッチファイル

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

Q&A

解決済

1回答

6965閲覧

Windowsバッチにおいて、for文のループ処理に正規表現や変数を使うことはできないのでしょうか

cotton__

総合スコア1

Windows

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

バッチファイル

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

0グッド

0クリップ

投稿2021/10/11 07:00

あるテキストファイルの3行目(の2トークン目)だけを変数hogeに代入したいのですが

set hensu=.\hoge\hoge.txt for /f "usebackq tokens=2" %%A in (`findstr /n /r "." %hensu% ^| findstr /r "^3:"`) do set hoge=%%A

このようにfindstrと正規表現を用いて3行目を抽出しようとすると、3行目、13行目、23行目・・・を代入していき、最終的に最後のn3行目を代入して処理を終了してしまいます。

しかし、

for /f "usebackq tokens=2" %%A in (`findstr /n /r "." .\hoge\hoge.txt ^| findstr /r "^3:"`) do set hoge=%%A

このように直接hoge.txtのパスを記述すると行頭「3:」のみを代入する理想の処理を行います。

findstr /n /r "." %hensu% | findstr /r "^3:"

このようにfindstr単体と変数で実行する分には行頭が「3:」である3行目を出力してくれるのですが・・・。

「^3:」で行頭が「3:」つまり3行目を抽出するつもりだったのですが、一定条件下でうまくいかない原因がわかりません。

for文と変数や正規表現の相性が悪いのかなど自分なりに探ってみたのですがお手上げです。。
仕様なのか、解決策があるのか、ご教授いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

掲載のコードだと再現しませんが、お書きの現象が起きているとすると、(二重引用符で囲まれていない)^が特殊文字で「次の文字をそのままの文字とする」というクォートの機能を持っているので、それが影響しているのでしょう。

例えば、findstr /r ^3:のように、二重引用符で囲まないとfindstr /r 3:と同じになります。
実際に実行しているコードがどうなっているのかわかりませんが、そういう状況であれば、^^と2つ重ねます(^^3:)。

なお、

あるテキストファイルの3行目(の2トークン目)だけを変数hogeに代入したいのですが

を実現したいのであれば、

CMD

1for /f "usebackq tokens=2 skip=2" %%A in ("%hensu%") do set hoge=%%A&goto NEXT 2:NEXT

skipした上で、3行目を処理した後gotoでループから抜けます。

投稿2021/10/11 10:00

otn

総合スコア85901

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

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

cotton__

2021/10/13 01:32

検証が足りておらず、再現しなかったとのことお手数おかけしました。 パイプの前に^を使っておきながら正規表現の^との競合の可能性を見落としておりました。 ご指摘の通り、"^^3:"としたところ、期待通りの3行目のみを抽出することに成功しました。 また、代替案の提示もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問