ファイル名と場所を含む変数で、すべてのバックスラッシュ()をスラッシュ(/)に変換しようとしています。私はこれについて読んで見ました:
%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:\=/%"
したいことをしていない誰かが私が間違っていることを見ることができますか?
ブロックステートメント_(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
には特別な意味はありません。
これにより、変数のバックスラッシュがスラッシュに変更されます。
set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"
これは私のために働くようです:
echo off
setlocal enabledelayedexpansion
FOR %%f IN ("C:\tools\workspace\*") DO (
set old=%%f
echo !old!
set new=!old:\=/!
echo !new!
echo.
)
ループ変数ではなく別の変数を使用すると違いが生じ、ループ変数%% fを使用した変数置換構文が機能しないため、遅延展開が可能になります。
これは、Windowsでバックスラッシュをスラッシュに変更する場合に機能します。
typedef std::basic_string<TCHAR> tstring;
tstring pathbasic = tstring(programdata) + _T("\\myfile.txt");
std::replace(pathbasic.begin(), pathbasic.end(), _T('\\'), _T('/'));