web-dev-qa-db-ja.com

Windowsバッチファイルでバックスラッシュをスラッシュに変更する

ファイル名と場所を含む変数で、すべてのバックスラッシュ()をスラッシュ(/)に変換しようとしています。私はこれについて読んで見ました:

%variable:str1=str2%

そして

set "var=%var:\=/%"

私はこれを試みましたが、明らかに正しくありません。

これが私の.batスクリプトの関連セクションです。

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (
  echo %%f  
  set "f=%%f:\=/%"
  echo %%f  
  echo.                 
)

出力には、各ファイル名が2回リストされます。

すなわち、この行:

set "f=f:\=/%"

したいことをしていない誰かが私が間違っていることを見ることができますか?

25
user3253319

ブロックステートメント_(a parenthesised series of statements)_内で、全体ブロックが解析され、その後が実行されます。ブロック内の_%var%_は、その変数の値に置き換えられますブロックが解析されるとき-ブロックが実行される前-同じことがFOR ... DO (block)にも当てはまります。

したがって、IF (something) else (somethingelse)は、IFが検出されたときに_%variables%_の値を使用して実行されます。

これを克服する2つの一般的な方法は、1)_setlocal enabledelayedexpansion_を使用し、_!var!_の代わりに_%var%_を使用してvarの変更された値にアクセスするか、2)を使用してサブルーチンを呼び出してさらに処理を実行することです変更された値。

したがって、varの変更された値を表示する_CALL ECHO %%var%%_の使用に注意してください。

コードには、fという2つの変数が含まれています。

最初は、fと呼ばれ、_%%f_によって参照されるループ制御「メタ変数」です。

2つ目は、_set "f=..."_ステートメントによって確立される共通環境変数fです。この変数は、block内で_%f%_ butを使用してアクセスできます。制御するforが解析されたときの値を保持しているように見えます(実際、_%var%_は解析時にvarの値に置き換えられますその時点で

metavariablesは、サブストリングや置換などの文字列操作ステートメントでは使用できません。これらの操作には共通の環境変数のみを使用できます。したがって、メタ変数fの値を環境変数fおよびthenに割り当てる必要があります環境変数fの文字列置換タスクを実行します。

もちろん、ツイストは、delayedexpansionと_!var!_構文を使用して、ブロック内の環境変数の変更された値にアクセスする必要があるということです。

そう、

_setlocal enabledelayedexpansion
for...%%f...do (
  echo %%f
  set "f=%%f"
  set "f=!f:\=/!"
  echo !f!
)
echo just for demonstration %f% !f! %%f
_

これにより、fの値が必要な方法で設定されます(もちろん、混乱を避けるために、常に名前を変更できます...)

最後の行は、単純にfによって取得された最終値に_%f%_または_!f!_のいずれかとしてループ外でアクセスでき、_%%f_がコンテキスト外であり、表示されることを示すことです。 _%f_として。

delayedexpansionなしでこれを行う別の方法は

_for...%%f...do (
  echo %%f
  set "f=%%f"
  call set "f=%%f:\=/%%"
  call echo %%f%%
)
echo just for demonstration %f% !f! %%f
_

違いはcallの使用と_%_ sの2倍であり、最終行は_!f!_をそのまま表示します-delayedexpansionモードの外では、_!_はただの別の文字ですcmdには特別な意味はありません。

20
Magoo

これにより、変数のバックスラッシュがスラッシュに変更されます。

set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"
62
foxidrive

これは私のために働くようです:

echo off

setlocal enabledelayedexpansion

FOR %%f IN ("C:\tools\workspace\*") DO (
  set old=%%f
  echo !old!
  set new=!old:\=/!
  echo !new!  
  echo.                 
)

ループ変数ではなく別の変数を使用すると違いが生じ、ループ変数%% fを使用した変数置換構文が機能しないため、遅延展開が可能になります。

4
dethorpe

これは、Windowsでバックスラッシュをスラッシュに変更する場合に機能します。

 typedef std::basic_string<TCHAR> tstring;
 tstring pathbasic = tstring(programdata) + _T("\\myfile.txt");
 std::replace(pathbasic.begin(), pathbasic.end(), _T('\\'), _T('/'));
0