Bat文件用于替换文件名中出现的所有字符

时间:2015-03-02 05:11:52

标签: regex batch-file full-text-search filenames

我需要在几千个文件名的列表上执行此操作,以便使用替换的字符重命名文件。目的是允许以下脚本在所有名称上运行

问题是“&”的名字标志。

我正在使用此脚本在包含数千个名称的列表中找到所有文件名,这些名称必须针对多个文件夹运行,这些文件夹只包含列表中的文件。如果找到,我可以将文件复制或移动到闪存驱动器上。

除了包含“&”的名称外,该脚本运行正常。不幸的是,有不少。除了找到一种方法逃避&在搜索过程中,我可以用任何独特的单词或字符替换它,以便在找到文件后运行搜索并将其反转。

初始脚本是这样的:

set list=C:\ALIST.txt
pushd %source%
for /f "tokens=*" %%a in (%list%) do (echo.%%a && call :FindIt "%%~a")
goto :End

:FindIt
for /f "tokens=* usebackq" %%b in (`dir /b /s /a-d-s-h "%~1"`) do (call :DoIt "%%~dpb" "%~1")
goto :EOF

:DoIt
set str=%~1
set str=%str:~0,-1%
set file=%~2
rem NOTE: ADD /MOV at end of next line  to move instead of COPY
robocopy "%str%" "%dest%" "%file%" 
goto :EOF

:End
popd

这是一位好朋友写的,我不赞成他的工作。 我到处寻找一种方法来做到这一点,他的剧本是一个天赐之物,它让我95%的方式结束。唯一的问题是让它接受“&”的名字签名或简称为找到替换“&”的方法签名暂时足以运行脚本。

任何想法或替代方案

2 个答案:

答案 0 :(得分:1)

问题似乎是缺少引号

set "str=%~1"
set "str=%str:~0,-1%"
set "file=%~2"

但是,如果没有完全了解如何/为什么这样做(可能它应该更短),完整的代码可以写成

pushd %source% && (
    for /f "tokens=*" %%a in (%list%) do (
        echo(%%a
        for /f "delims=" %%b in ('
            dir /b /s /a-d-s-h "%%~a"
        ') do robocopy "%%~dpb\." "%dest%" "%%~a"
    )
    popd
)

没有call且没有子串操作。

答案 1 :(得分:0)

虽然我不能担保空格和特殊字符,但这似乎很有效。将其放在名为 This.that.and.the.other.bat

的文件中
@echo off
setlocal EnableDelayedExpansion
set src=%~n0
set "tgt=%src:.=!p! " & call set "tgt=!tgt!%"
@echo %src%
@echo %tgt%
endlocal