1

根据 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”,或者任何东西

有人可以解释一下吗?先感谢您

4

4 回答 4

3

打扰一下。有时我觉得我不太明白这些问题(可能是因为我的母语不是英语)。

在你的问题中,你说你想用'foo'替换“mypath变量中'X'之后和'打开文件'之前的文本......静态文本。它可以是“Dboard”或任何东西”,但在您的代码和答案中的后面注释中,您似乎只想将字符串“Dashboard”或“Dboard”更改为“foo”。这让我很困惑。

无论如何,这是我对您的问题的解决方案(而不是您的评论)。

@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

...这正是您的要求。

于 2013-05-17T03:47:43.447 回答
3

对于带有变量的字符串操作,您需要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
于 2013-05-16T19:41:14.763 回答
2

您的问题是使用%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%

如果有更优雅的方法可以做到这一点,请告诉我们:)

于 2013-05-16T21:06:20.920 回答
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

你能试试这个吗?

于 2013-05-16T19:39:15.660 回答