🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

バッチファイル

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

2回答

8907閲覧

バッチファイルでテキストファイルの中身にエクスクラメーションマークが含まれる場合の読み出し

marusa

総合スコア17

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

バッチファイル

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2020/12/28 07:35

前提・実現したいこと

Windowsのバッチスクリプトで、ファイルの読み込み→置換→保存をするバッチを作成しています。
処理の中身で遅延環境変数を使う必要がある(と思っている)ので、遅延環境変数を利用する環境です。

発生している問題・エラーメッセージ

以下のようなファイルを読み込みたいときに、エクスクラメーションマークが無視されてしまう。

#####入力ファイル

sampleIn

1aaa 2bbb 3ccc 4!aa 5!bb

#####出力ファイル

sampleOut

1aaa 2bbb 3changed 4aa 5bb

該当のソースコード

batchScript

1@echo off 2 3setlocal ENABLEDELAYEDEXPANSION 4chcp 65001 5 6if exist sampleOut.txt del sampleOut.txt 7 8set changeLineNum=3 9rem changeLineNumはバッチファイル内で変更される可能性があります 10set num=0 11for /f "delims=" %%l in (sampleIn.txt) do ( 12 set /a num=num+1 13 if not !num! EQU !changeLineNum! ( 14 echo %%l >> sampleOut.txt 15 ) else ( 16 echo changed >> sampleOut.txt 17 ) 18)

試したこと

  • 11行目

echo %%l >> sampleOut.txt
-echo. %%l >> sampleOut.txtに変更したが、うまくいかなかった。
-echo !%%l! >> sampleOut.txtに変更したが、うまくいかなかった。

補足情報(FW/ツールのバージョンなど)

windows Version 10.0.18363.1256

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

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

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

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

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

guest

回答2

0

自己回答のリンク先は、私の回答ですね。
このコードだと、遅延展開はifでの数値の参照だけなので、

CMD

1@echo off 2 3chcp 65001 4 5if exist sampleOut.txt del sampleOut.txt 6 7set changeLineNum=3 8rem changeLineNumはバッチファイル内で変更される可能性があります 9set num=0 10for /f "delims=" %%l in (sampleIn.txt) do ( 11 set /a num=num+1 12 call :check 13 if errorlevel 1 ( 14 echo %%l >> sampleOut.txt 15 ) else ( 16 echo changed >> sampleOut.txt 17 ) 18) 19exit /b 20 21:check 22if not %num% EQU %changeLineNum% exit /b 1 23exit /b 0

なお、EQUの否定の演算子NEQもあります。

投稿2020/12/28 09:47

otn

総合スコア85882

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

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

0

自己解決

既存質問に回答がありました。類似の質問となってしまい申し訳ありません。

https://teratail.com/questions/96353#reply-149320

投稿2020/12/28 07:56

marusa

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問