批量调用另一个批处理并使用输出作为变量

时间:2014-02-19 06:59:11

标签: string variables batch-file

我正在尝试将一堆文件与

这样的名称进行比较
  

“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

1 个答案:

答案 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中检索。)