Windows批处理脚本问题 - 替换

时间:2016-02-08 10:13:14

标签: windows batch-file batch-processing

你有一个for循环,我用来从一个驱动器的循环中获取条目,对于每个驱动器我遍历文件中的条目,这一切都有效。但接下来我要做的是从文件中找到条目(这是一个文件名和路径,没有驱动器号和第一个文件夹(父文件夹名为%_TAG%)

好到目前为止一切都那么好,现在我要做的是用r替换文件的扩展名(* .w或* .p或* .cls必须变成* .r)

但由于某种原因,我的命令不起作用(设置str =!str:.w = .r!)我试过更换!与%

我尝试过各种各样的东西但仍然坚持下去。这是我的完整批处理文件。它读入一个包含部分路径和文件名列表的文件。我甚至尝试使用函数来重命名

:bof
    @echo on
    cls
    setlocal enabledelayedexpansion
:init
    set _TAG=TST
    set /p _INFILE="Enter Filename to use for investigation: "
    set _INFILE=%CD%\%_INFILE%
    set /p _TAG="To which environment did you deploy? (TST / LIV): "
    if /i "%_TAG%"=="LIV" (
      set _drive=M O P R S Y X
    ) else (
      set _drive=M T X
    )
:confirm
    echo We will use code in the: %_TAG% folder and file: %_INFILE% and drives: %_drive%
    set /p _continue="Do you wish to continue (Y/N): "
    if /i "%_continue%"=="N" goto :eof
    echo We will use code in the: %_TAG% folder and file: %_INFILE% and drives: %_drive%  1>> %_INFILE%.%_TAG%.rlog 2>&1
:dowork
    for %%j in (%_drive%) do (
        echo ...
        echo investigating: %%j:\%_TAG%\ 1>> %_INFILE%.%_TAG%.rlog 2>&1
        %%j:
        cd %%j:\%_TAG%\
        for /f %%i in (%_INFILE%) DO  ( 
            set "string=%%i"
            call:mySetPathFunc !string! "/"    "\"
            call:mySetPathFunc !string! ".w"   ".r"
            call:mySetPathFunc !string! ".p"   ".r"
            call:mySetPathFunc !string! ".cls" ".r"
            if exist %%j:\%_TAG%\!string! (
                echo I found you in correct folder 1>> %_INFILE%.%_TAG%.rlog 2>&1
            ) else ( 
                echo I did not find you in correct folder 1>> %_INFILE%.%_TAG%.rlog 2>&1
            )
            call:mySetPathFunc !string! "cbsrc"  "tty"
            call:mySetPathFunc !string! "hotfix" "tty"
            if exist %%j:\%_TAG%\%%string%% (
                echo I found you in tty 1>> %_INFILE%.%_TAG%.rlog 2>&1
            ) else ( 
                echo I did not find you in tty 1>> %_INFILE%.%_TAG%.rlog 2>&1
            )

        )
    )
:eof
  ECHO Done used - tag: %_TAG% and used file: %_INFILE% to drive %_drive%
  ECHO Done used - tag: %_TAG% and used file: %_INFILE% to drive %_drive% 1>> %_INFILE%.%_TAG%.rlog 2>&1
  timeout /t 8 /nobreak > NUL
  c:
  exit /b 

::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:mySetPathFunc    - passing a variable by reference
      echo before %~1 1>> %_INFILE%.%_TAG%.rlog 2>&1
    set %~1=%~1:%~2=%~3
      echo after %~1 1>> %_INFILE%.%_TAG%.rlog 2>&1
goto:eof

1 个答案:

答案 0 :(得分:1)

第955代“delayedexpansion”问题。

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

如果涉及旗帜,情况会再次发生变化。 set "flag="将确保清除标记。 set "flag=somethingelse"将确保设置(值不相关。)使用if defined flag (doiftrue) else (doiffalse)适用于flag运行时(当前)状态 - 而不是分析时间值。

在SO上查找有关delayedexpansion的数百项解决方案。