こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Windowsコマンドプロンプトで環境変数の%置換

Windowsコマンドプロンプト(cmd)で、以下のコマンドにて環境変数の内容の置換ができますが、

set TEST1=ABC
echo %TEST1:A=C%
CBC

"%"で置換するというのはどのようにすればできますでしょうか?
例えば上記の"ABC"の文字列を"A%C"にしたいような場合です。

コマンドプロンプトの動作仕様の訳分からなさに辟易しております…
ご存知の方などいらっしゃいますでしょうか?

投稿日時 - 2010-12-21 20:34:05

QNo.6399129

困ってます

質問者が選んだベストアンサー

環境変数の遅延展開を使用すれば置換できます。

こんな感じです。XP Proで動作確認しました。

setlocal ENABLEDELAYEDEXPANSION
set TEST1=ABC
set TEST2=!TEST1:B=%%!
echo %TEST2%

投稿日時 - 2010-12-22 14:55:01

お礼

ありがとうございます。たしかにこれでいけそうです!!

同様なことを一行ずつの実行でコマンドプロンプトで試していたのですが、
それだとうまくいかなかったので諦めていました。
バッチファイルとして実行させるとうまくいくようですね…

遅延環境変数を使うと"%"が区切り用の文字と判定されなくなるのが
おもしろいところですね。

投稿日時 - 2010-12-22 21:04:40

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#2,3です。

すいません。回答ではないのですが、#4 さんの回答、素晴らしいですね!
なるほど遅延展開って、こう使うんだ。

おかげで私も長年のモヤモヤを晴らせました。
ありがとうございます。

投稿日時 - 2010-12-22 22:00:36

ANo.3

#1 さんの回答にダウト。
(ごめんなさい)

>echo %TEST1:ABC=%A%C

これは %TEST1:ABC=% で空文字ができて、その後ろに A%C があるため、結果として A%C になっているだけですね。

投稿日時 - 2010-12-22 00:00:22

お礼

ご指摘ありがとうございました。

投稿日時 - 2011-03-20 12:00:05

ANo.2

自分も何度か挑戦した事があります。

例えば、DOSではエスケープするのに "^"(キャレット)を使うので、それを試してみたりとか。

で、結果としては、頓挫しました。
多分、無理ではないかと思っています。

代替案としては。

何かユーティリティをインストールしてもよい環境なら
→cygwinなどを入れて tr や sed, awk , perl などを使う。

インストールが許されない環境なら
→VBScriptなどでReplace関数で置換するバッチを作って代替。

ex) cygwin の tr.exe
set TEST1=ABC
echo %TEST1% | tr B %
A%C

投稿日時 - 2010-12-21 23:55:24

補足

いろいろ検索してみました

元ネタ
http://fdays.blogspot.com/2007/11/blog-post.html


@echo

set before=ABC
set search=B
set replace=%%
set after=
set replace_wk=

:loop
if "%before%" == "" goto :end
for /f "tokens=1* delims=%search%" %%A in ("%before%") do (
  set after=%after%%replace_wk%%%A
  set before=%%B
  set replace_wk=%replace%
)
goto :loop

:end
echo %after%


実行結果

A%C


なんか泣けてくる…

投稿日時 - 2010-12-22 06:32:22

お礼

ありがとうございます。
私も "^"(キャレット)を試して玉砕しました。
単純に次の%を探してそこを範囲終了と見なすような動きです
中途半端な仕様ですね…

投稿日時 - 2010-12-22 06:34:56

ANo.1

なぜかこうはできました
C:\Windows\system32>set TEST1=ABC

C:\Windows\system32>echo %TEST1:ABC=%A%C
A%C

投稿日時 - 2010-12-21 23:35:29

補足

No2への補足入力ですが、一度入力すると再度編集・追記できないクソ仕様なので、ここに記入させていただきます

sh版のロジックは既に作成してあるので、cygwinが使えれば速攻解決なのですが、cygwinが使用できない環境でも
利用できるようにバッチで作成しようとしています。

遅延環境変数の展開など、shの知識でコーディングをしていると確実にはまりますね…
DOS時代の簡易機能から増改築を繰り返した名残でしょうか!?

投稿日時 - 2010-12-22 06:45:49

お礼

ご回答ありがとうございます。
残念ながら、No3さんの回答の通りなようです…

投稿日時 - 2010-12-22 06:47:55

あなたにオススメの質問