[英]batch variable nested into a batch variable
根據mypath變量中“ X”之后和“打開文件”之前的文本,我想調用一個傳遞此文本作為參數的函數,以將其替換為“ foo”。 為此,我寫了
@echo off
SET mypath=Y:\SUT\ISTQB\Board Airport\X\Dashboard\Open file
if /i %1=="Dashboard" goto label %1
if /i %1=="Dboard" goto label %1
:label
SET mypath=%mypath:\%1\=foo%
ECHO %mypath%
我注意到該腳本輸出末尾的回顯mypath
Y:\SUT\ISTQB\Board Airport\X\Dashboard\Open file instead of
Y:\SUT\ISTQB\Board Airport\X\foo\Open file
我認為問題出在'SET mypath =%mypath:\\%1 \\ = foo%'中的參數%1,但我不明白為什么。
實際上,我絕對需要使用參數%1,因為當前位於mypath變量中的“儀表板”文本不是靜態文本。 它可以是“ Dboard”或其他任何內容
有人可以解釋我嗎? 先感謝您
對於使用變量的字符串操作,您需要delayed expansion
:
@echo off
SET mypath=Y:\SUT\ISTQB\Board Airport\X\Dashboard\Open file
if /i %1=="Dashboard" goto label %1
if /i %1=="Dboard" goto label %1
:label
setlocal enabledelayedexpansion
SET mypath=!mypath:\%~1\=foo!
ECHO %mypath%
..輸出為:
Y:\SUT\ISTQB\Board Airport\XfooOpen file
勞駕。 有時我認為我不太了解這些問題(可能是因為我的母語不是英語)。
在您的問題中,您說過要替換“在mypath變量中的'X'之后和'Open file'之前的文本...用'foo'替換”,甚至您說“當前在“ myash”變量中的“儀表板”文本不是可以是“ Dboard”,也可以是任何文本”,但是在代碼和答案中的后注中,您似乎只是想通過“ foo”更改字符串“ Dashboard”或“ Dboard”。 這使我感到困惑。
無論如何,這是我對您的問題 (而不是您的評論)的解決方案。
@echo off
setlocal EnableDelayedExpansion
SET mypath=Y:\SUT\ISTQB\Board Airport\X\Dashboard\Open file
rem Get the text after 'X' and before 'Open file'
set auxPath=%mypath%
set enclosed=
set text=
:nextPart
for /F "tokens=1* delims=\" %%a in ("%auxPath%") do (
if "%%a" equ "Open file" (set enclosed=) else (
if defined enclosed (set "text=!text!\%%a") else (
if "%%a" equ "X" (set enclosed=1)
))
set "auxPath=%%b"
)
if defined auxPath goto nextPart
set text=%text:~1%
rem Replace that text by "foo"
call :Change "%text%"
goto :EOF
:Change
SET mypath=!mypath:\%~1\=\foo\!
ECHO %mypath%
exit /B
例如,上一個程序的輸出是這樣的:
Y:\SUT\ISTQB\Board Airport\X\foo\Open file
但是如果mypath變量是這樣的:
Y:\SUT\ISTQB\Board Airport\X\One\Two three\Open file
...的輸出將是這樣的:
Y:\SUT\ISTQB\Board Airport\X\foo\Open file
...正好可以解決您的要求。
@echo off
SET mypath=Y:\SUT\ISTQB\Board Airport\X\Dashboard\Open file
if /i "%~1"=="Dashboard" goto :label
if /i "%~1"=="Dboard" goto :label
goto :eof
:label
rem set temp_var=%~1
rem call SET mypath=%%mypath:%temp_var%=foo%%
rem echo %mypath%
setlocal enabledelayedexpansion
set mypath=!mypath:%~1=foo!
ECHO !mypath!
endlocal
你可以試試這個嗎?
您的問題是使用%1
進行搜索/替換:-
SET mypath=%mypath:\\%1\\=foo%
包含太多的%
字符,使語法有點混亂。
這個答案是使用EnableDelayedExpansion
來利用!
語法,但要注意%mypath%變量將在endlocal
之后丟失其值-它僅將其值保留在setlocal
塊內。
解決此問題的一種方法是將SET
命令寫入一個臨時批處理文件,然后在本地塊之后調用它:
setlocal EnableDelayedExpansion
SET mypath=!mypath:%1=foo!
rem Create a batch file to perform SET later :
echo @SET mypath=%mypath% > "%TEMP%\setmyvar.bat"
endlocal
rem Now use the batch file to set the variable :
call "%TEMP%\setmyvar.bat"
ECHO %mypath%
如果有更優雅的方法,請告訴我們:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.