我正在尝试将一堆文件与
这样的名称进行比较“BD12-CD9.txt”
到名为
的文件夹“BD12-CD9 - somefoldername”
我正在移除.txt扩展名以获取ID代码“BD12-CD9”,并想检查文件夹名称是否包含代码。
如果没有完全比较字符串的if语句,我无法弄清楚如何做到这一点。 (这可能是一个简单的解决方案,如jQuery的indexOf())
所以我需要从文件名中删除ID代码并进行直接比较。
问题是ID和名称并不总是完全相同的长度,例如“BD12-CD10.txt”所以我不能只做“set folderName2 =!folderName:~0,8!”
我找到了一个strlength函数,并把它放在另一个名为strlen.bat的批处理文件中,它运行得很好,与我剥离的ID代码的长度相呼应。我如何使用回显值?
move.bat
@echo off
@setlocal enabledelayedexpansion
set "errfolderpath=C:\Testing\Moving txt files automatically\"
echo.
for %%x in (*.*) do (
set fileName=%%x
set fileName2=!fileName!
set fileName2=!fileName2:~0,-4!
call strlen !fileName2!
FOR /D %%K in ("%errfolderpath%*") DO (
SET folderName=%%~nK
set folderName2=!folderName!
set folderName2=!folderName:~0,11!
echo folder: !folderName2!, file: !fileName2!
if !folderName2! == !fileName2! echo MOVE '!fileName!' to '!folderName!'
)
echo %_len%
echo.
)
PAUSE
strlen.bat
@echo off
:: strlen.bat
:: http://acm.zhihua-lai.com
if [%1] EQU [] goto end
:loop
if [%1] EQU [] goto end
set _len=0
set _str=%1
set _subs=%_str%
:getlen
if not defined _subs goto result
:: remove first letter until empty
set _subs=%_subs:~1%
set /a _len+=1
goto getlen
:result
echo %_len%
shift
goto loop
:end
答案 0 :(得分:1)
对于批处理文件变量用法,如果查看代码,则定义名为_len
的变量。然后将此变量回显给控制台,但不会被删除(没有重新签名,没有endlocal,...),所以只需使用它。
无论如何,它比看起来容易。
@echo off
setlocal enableextensions disabledelayedexpansion
set "errfolderpath=C:\Testing\Moving txt files automatically"
for %%a in (*.txt) do (
set "notMoved=1"
for %%b in ("%errorfolderpath%\%%~na*") do if defined notMoved (
set "notMoved="
move "%%~fa" "%%~fb"
)
)
对于每个文件,搜索具有相同前缀的文件夹(%%a
中引用的文件的名称,不带扩展名,为%%~na
)。如果找到,请将文件(文件的完整路径为%%~fa
)移动到目标文件夹,并使用开关变量将文件“标记”为移动,以避免出现两个具有相同前缀的文件夹时出现问题(将在内部for %%b
中检索。)