【问题标题】:Search and replace string with uppercase letters in series of batch-files在一系列批处理文件中搜索并用大写字母替换字符串
【发布时间】:2016-02-03 15:38:18
【问题描述】:

您好,我正在尝试在一系列文件夹中的一系列批处理文件中搜索和替换包含用户名的字符串。 IE。我在网络驱动器上有一系列批处理文件,需要为一些同事将它们传输到本地 PC 驱动器,在此过程中,我需要更改批处理文件中的用户名以匹配本地 PC 的用户名。并且用户名必须全部为大写字母。为此,我使用了一段我曾经对单个文件执行相同操作的代码,但是我在将代码转换为对一系列文件夹中的一系列文件执行相同操作时遇到问题。我正在使用 Windows 7 机器。我试过的代码如下(请不要说第一段代码将网络驱动器(O:-drive)的树形结构镜像到本地驱动器(B:-drive)并复制不需要的文件在搬家的过程中要改。给我带来麻烦的部分从SETLOCAL ENABLEDELAYEDEXPANSION这行开始):

for /f "delims=" %%a in ('dir /b/ad "o:\afstem*" ') do (

echo m | xcopy /t /e /y "o:\%%a\Ta" "b:\%%a\Ta"

mkdir "b:\%%a\Nyta"

echo f | xcopy /s /y /d "o:\%%a\Ta\*moms" "b:\%%a\Ta\*moms"

SETLOCAL ENABLEDELAYEDEXPANSION
SET String=%username%

CALL :UpCase String

set txtfile=o:\%%a\Ta\*.bat
set newfile=b:\%%a\Ta\*.bat
if exist "%newfile%" del /f /q "%newfile%"
set search=SHL
set replace=%String%
for /f "tokens=*" %%a in (%txtfile%) do (
    set newline=%%a
    call set newline=%%newline:%search%=%replace%%%
    call echo %%newline%% >>%newfile%
)

ENDLOCAL
GOTO:EOF)


:UpCase
:: Subroutine to convert a variable VALUE to all upper case.
:: The argument for this subroutine is the variable NAME.
SET %~1=!%1:a=A!
SET %~1=!%1:b=B!
SET %~1=!%1:c=C!
SET %~1=!%1:d=D!
SET %~1=!%1:e=E!
SET %~1=!%1:f=F!
SET %~1=!%1:g=G!
SET %~1=!%1:h=H!
SET %~1=!%1:i=I!
SET %~1=!%1:j=J!
SET %~1=!%1:k=K!
SET %~1=!%1:l=L!
SET %~1=!%1:m=M!
SET %~1=!%1:n=N!
SET %~1=!%1:o=O!
SET %~1=!%1:p=P!
SET %~1=!%1:q=Q!
SET %~1=!%1:r=R!
SET %~1=!%1:s=S!
SET %~1=!%1:t=T!
SET %~1=!%1:u=U!
SET %~1=!%1:v=V!
SET %~1=!%1:w=W!
SET %~1=!%1:x=X!
SET %~1=!%1:y=Y!
SET %~1=!%1:z=Z!
GOTO:EOF

提前感谢您的任何帮助/建议

更新

感谢 Dmitry Sokolow 提供的以下代码解决了我的问题

set txtfile=o:\%%a\Ta\*.bat
set newfileprefix=b:\%%a\Ta\
set search=SHL
set replace=!String!
for %%F in (!txtfile!) do (
    if exist "!newfileprefix!%%~nxF" del /f /q "!newfileprefix!%%~nxF"   
    for /f "tokens=*" %%Z in (%%F) do (
        set newline=%%Z
        call set newline=%%newline:!search!=!replace!%%
        echo !newline! >>!newfileprefix!~nx%%F
    )
)

【问题讨论】:

  • 所以麻烦的部分是 90% 的代码...尝试缩小范围。
  • 您在大循环中有GOTO:EOF,但goto 打破了循环。
  • 谢谢,删除了GOTO:EOF,但还是没有成功
  • 如果我将set txtfile=o:\%%a\Ta*.batset newfile=b:\%%a\Ta*.bat 替换为txtfile=o:\afstem05\Ta\name.batset newfile=b:\afstem05\Ta\name.bat 并去掉SETLOCAL ENABLEDELAYEDEXPANSION 之前的代码,它就可以正常工作。问题似乎是我没有正确格式化代码以在一系列文件中搜索和替换

标签: batch-file search replace wildcard


【解决方案1】:

for循环中你应该使用!var!来得到var的实际值,所以

set txtfile=o:\%%a\Ta\*.bat
set newfile=b:\%%a\Ta\*.bat
if exist "!newfile!" del /f /q "!newfile!"
set search=SHL
set replace=!String!
for /f "tokens=*" %%Z in (!txtfile!) do (
    set newline=%%Z
    call set newline=%%newline:!search!=!replace!%%
    echo !newline! >>!newfile!
)

更新。

set txtfile=o:\%%a\Ta\*.bat
set newfileprefix=b:\%%a\Ta\
...
for %%F in (!txtfile!) do (
    for /f "tokens=*" %%Z in (%%F) do (
        set newline=%%Z
        call set newline=%%newline:!search!=!replace!%%
        echo !newline! >>!newfileprefix!%%F
    )
)

【讨论】:

  • 谢谢你,这确实帮了很多忙。不过还是有问题。我对编程很陌生,所以我可能错了,但set txtfile=o:\%%a\Ta\*.bat 似乎有问题,也许 set 命令不适用于通配符?
  • set txtfile=o:\%%a\Ta\*.bat 设置文件掩码。要通过掩码处理文件,您需要另一个循环。查看更新。
  • 再次非常感谢您的帮助。我在代码中制作了两个 canges 以使其正常工作。在echo !newline! >>!newfileprefix!%%F 行中,%%F 指的是路径和文件名,所以我添加了~nx 来获取文件名和扩展名。如果目标文件已经存在,我还更改了删除目标文件的代码。请查看更新。
  • 看起来更改被拒绝了。您应该将您的更改作为更新移动到您的原始帖子(问题)中。
  • 我已将更改添加为对原始帖子的更新。非常感谢您对代码和如何在 stackoverflow 上发布的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2011-02-15
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2014-05-10
相关资源
最近更新 更多