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

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

新規登録して質問してみよう
ただいま回答率
85.33%
バッチファイル

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

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

Q&A

解決済

2回答

223閲覧

バッチファイルからダブルクォーテーションが除去できない

sandu

総合スコア12

バッチファイル

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

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

0グッド

0クリップ

投稿2025/02/19 06:36

実現したいこと

バッチファイルで読み込んだjsonファイルの文字列を分割した際にダブルクォーテーションが存在しているため消したいです。

発生している問題・分からないこと

test.jsonの3行目の文字列を分割して1.2.3を取得したいのですが、出力されるtemp.jsonの先頭にダブルクォーテーションが付いていて消し方がわかりません。
以下読み込むファイル test.json

{ "system": "TEST", "version": "1.2.3" }

該当のソースコード

set "input=C:\Users\shiro\OneDrive\デスクトップ\batTest\test.json" set "lineNum=3" set "output=tmp.json" set "search="version"" find %search% %input% echo ERRORLEVEL=%ERRORLEVEL% if %ERRORLEVEL% == 0 ( set "cnt=0" for /f "tokens=*" %%a in (%input%) do ( set /a cnt+=1 if !cnt! == %lineNum% ( for /f "tokens=2 delims=: " %%v in (%%a) do ( echo %%v ) ) else ( echo %%a ) ) ) > %output%

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

"1.2.3の先頭の"を消したい。
以下出力ファイル tmp.json

{ "system": "TEST", "1.2.3 }

補足

最終的には1.2.3を編集して"version": "編集したバージョン"にしたい。

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

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

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

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

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

YAmaGNZ

2025/02/19 06:41

PowerShellではダメなのでしょうか?
sandu

2025/02/19 06:49

powershellを使ったことがなく、powershellでできるのなら教えていただきたいです。
melian

2025/02/19 07:15

この場合、3行目ではなく version キーの値を取り出す様にするとよいかと思います。 $input = "test.json" $json = Get-Content $input -Raw | ConvertFrom-Json echo $json.version
guest

回答2

0

ベストアンサー

これはかなり厳しいですね。バッチスクリプトは"の扱いが困難です。
「ダブルクォート"と空白 の2つを区切り文字として分割した3つ目を取る」という方針でやってみましょう。

CMD

1 for /f tokens^=3^ delims^=^"^ %%v in (%%a) do (

間の空白の個数を間違えないようにして下さい。

/fの後のパラメータ部分をクォーテーションマーク"で囲んでまるっとクォートするのでなく、バッチスクリプトの特殊文字のイコール= 空白 ダブルクォート"を1文字ずつ^でクォートします。

^は「直後の1文字をクォートする」という機能です。それ自体がクォートされてない限りですが。
"tokens=3 delims=^" "だと、^"に囲まれてクォートされているため「直後の1文字をクォートする」という機能を失ってしまうので駄目です。

追記

と思いましたが、単純に「"の削除」と考えると

CMD

1 for /f "tokens=2 delims=: " %%v in (%%a) do ( 2 set v=%%v 3 echo !v:"=! 4 )

一旦変数にセットすると、文字列置換が使えます。変数中のすべての"を削除。こちらは簡単ですね。

いずれにせよ、バッチスクリプトでの文字列処理は難しいです。
ファイルの3行目が"version": "1.2.!3!"だったりするとこれらコードでは駄目です。
!があっても大丈夫なように作り直すのは多分可能。

「どんな文字が来てもOK」というのはバッチスクリプトでは無理と思った方が良いです。そういうケースでは他の言語を検討しましょう。

投稿2025/02/19 14:07

編集2025/02/19 14:23
otn

総合スコア86167

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

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

sandu

2025/02/19 22:20

ありがとうございました。 解決できました。
guest

0

PowerShellであれば下記のようにファイルからJSONを読み込み、編集後JSONを出力できます。

powershell

1$readJSON = "test.json" 2$writeJSON = "tmp.json" 3 4#JSONデータを読み込む 5$jsonObject = Get-Content -Path $readJSON -Raw | ConvertFrom-Json 6 7#バージョンを出力 8echo $jsonObject.version 9 10#バージョンを編集 11$jsonObject.version = "2.3.4" 12 13#JSONを書き込む 14ConvertTo-Json $jsonObject | Out-File -FilePath $writeJSON 15

投稿2025/02/19 07:50

YAmaGNZ

総合スコア10520

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問