簡體   English   中英

批處理變量嵌套到批處理變量中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM