2013-05-16 227 views
1

根据“x”之后和mypath变量中的“打开文件”之前的文本,我想调用传递此文本作为参数的函数,以便将其替换为'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 

我认为这个问题是有关参数%1“SET mypath中=%mypath中内:\%1 \ = foo%',但我不明白为什么。

事实上,我绝对需要使用参数%1,因为当前“仪表板”中的文本变为mypath变量不是静态文本。它可以是“Dboard”,或任何东西

有人可以解释我吗?预先感谢您

回答

2

对于字符串操作与变量,你需要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% 

..output是:

Y:\SUT\ISTQB\Board Airport\XfooOpen file 
+0

执行myfile.bat“Dboard”我的输出是Y:\ SUT \ ISTQB \ Board Airport \ X \ Dashboard \打开文件,而不是我为你; – new

+0

和它的正常be.YOu想要用FOO替换DASHBOARD,但是如果你通过DBOARD,则什么都不会被替换。 – npocmaka

+0

是的,如果你想替换“Dboard”,你必须搜索“Dboard”,如果搜索失败,什么都不能替代。 – Endoro

2
 @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

Intresting问题:我们有40'时间和张贴到同一分钟':-)' – Endoro

+0

是的。你是我最激烈的竞争对手在这里... – npocmaka

+0

我尝试它,它不会改变问题! – new

2

你的问题是使用%1查找/替换: -
SET mypath=%mypath:\%1\=foo%有太多%字符使语法有点不安。

这个答案是使用EnableDelayedExpansion!语法,但要注意endlocal后%mypath中%变量将失去它的价值 - 它不仅保持了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% 

如果有一个更优雅的方式来做到这一点,请让我们知道: )

+0

''有太多的%字符使得语法稍微有些扰乱。我的天啊!你**必须**看到我的一些真正的'%'扰乱代码! – Endoro

3

不好意思。有时我觉得我并不真正理解这些问题(也许是因为我的母语不是英语)。

在你的问题中,你说你想用'foo'替换“'X'之后和'打开文件'之前的文本...'甚至你说'现在是”仪表板“的文本变成mypath变量不是一个静态文本,它可以是“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 

......这正好解决了y我们的要求。

+0

+1,除了一点之外的最佳答案:OP在“X”之后不在“X \”之后写下文字:) – Endoro

+1

@Endoro:是的。在问题的上下文中,似乎'X'和'打开文件'字符串应该由左斜线字符(以及替换的'foo'字符串)分隔。 OP的预期结果证实了这一点:'Y:\ SUT \ ISTQB \ Board Airport \ X \ foo \ Open file',这一点在其他答案中没有得到解决...... – Aacini