我需要在几千个文件名的列表上执行此操作,以便使用替换的字符重命名文件。目的是允许以下脚本在所有名称上运行
问题是“&”的名字标志。
我正在使用此脚本在包含数千个名称的列表中找到所有文件名,这些名称必须针对多个文件夹运行,这些文件夹只包含列表中的文件。如果找到,我可以将文件复制或移动到闪存驱动器上。
除了包含“&”的名称外,该脚本运行正常。不幸的是,有不少。除了找到一种方法逃避&在搜索过程中,我可以用任何独特的单词或字符替换它,以便在找到文件后运行搜索并将其反转。
初始脚本是这样的:
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%的方式结束。唯一的问题是让它接受“&”的名字签名或简称为找到替换“&”的方法签名暂时足以运行脚本。
任何想法或替代方案
答案 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