2013-05-16 225 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