FOR循环

时间:2017-03-07 12:08:20

标签: batch-file for-loop substring string-parsing

我试图在FOR循环中使用子字符串操作,但我不能让它为爱和金钱而工作。我被告知我们不能对循环变量(%% f等)使用子串操作,所以你必须设置另一个变量来等于循环(设置MyVariable = %% f),然后使用一个子串选项来处理这个decendent(设置MyOtherVar =%MyVariable:~0,-3%)。但是,当回显这些变量时,只有循环变量设置为/非空。

这是我目前正在使用的代码。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET OutPref="373137#"
SET OutSuf1="#Window Clean POD "
SET OutSuf2="#1520755.pdf"
SET MatchStr=@mydomain.com
cd c:\Oscar\Scripts\FileNamer\Inbound\
for /f "tokens=*" %%f in ('dir /b *.pdf') do (
    c:\Oscar\Scripts\FileNamer\pdftotext.exe -q %%f
    set InPdfVer=%%f
    set InTxtVer=%InPdfVer:~0,-3%txt
    echo Loop Val= %%f
    echo InPdfVer= %InPdfVer%
    echo InTxtVer= %InTxtVer%
    pause
    set InAddLine=findstr %MatchStr% %InTxtVer%

    set stemp=%InAddLine%
    set pos=0
    :loop
    set /a pos+=1
    echo %stemp%|findstr /b /c:"%MatchStr%" >NUL
    if errorlevel 1 (
            set stemp=%stemp:~1%
            if defined stemp GOTO loop
            set pos=0
            )

    set /a pos-=3
    call set StoreNo=%InAddLine:~%pos%,-25%
    call:getvalue C:\Oscar\Scripts\FileNamer\StoreList.inf %StoreNum% StoreName
    set OutFile=%OutPerf%%StoreNo%%OutSuf1%%StoreName%%OutSuf2%
    move %%f c:\Oscar\Scripts\FileNamer\Outbound\%OutFile%

)
cd c:\Oscar\Scripts\FileNamer\
exit 0

:getvalue
rem This function reads a value from a file and stored it in a variable
rem %1 = name of file to search in
rem %2 = search term to look for
rem %3 = variable to place search result
FOR /F "tokens=1,2* delims==" %%i in ('findstr /b /l /i %~2= %1') DO set %~3=%%~j
goto:eof

希望这是有道理的,可以试着解释一下。很可能底部也没有用,但没有那么远!

感谢任何想法,作为一般概述,脚本应该在传入文件夹中获取PDF文件,将它们转换为文本,在该文件中搜索电子邮件地址,在外部列表中查看该电子邮件地址,然后移动PDF文件(在过程中用一个共同约定重命名文件),然后在循环中移动到下一个文件,直到匹配文件结束。

亲切的问候, 奥斯卡

好的,所以其余部分似乎现在应该是什么,但我仍然无法设置这个子字符串,我只是在decendent变量中得到整个字符串。这是新代码(请原谅用于排除故障的暂停和回声)。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET OutPref=373137#
SET OutSuf1=#Window Clean POD 
SET OutSuf2=#1520755.pdf
SET MatchStr=@mydomain.com
cd c:\Oscar\Scripts\FileNamer\Inbound\
for /f "tokens=*" %%f in ('dir /b *.pdf') do (
    c:\Oscar\Scripts\FileNamer\pdftotext.exe -q %%f
    set InPdfVer=%%f
    call set InTxtVer=!InPdfVer:~0,-3!txt
    for /f "tokens=*" %%x in ('findstr !MatchStr! !InTxtVer!') do set InAddLine=%%x
    call:getpos
    echo !pos!
pause
    call set StoreNo=!InAddLine:~!pos!,-25!
    call:getvalue C:\Oscar\Scripts\FileNamer\StoreList.inf !StoreNum! StoreName
echo OutPerf !OutPref!
echo StoreNo !StoreNo!
echo OutSuf1 !OutSuf1!
echo StoreName !StoreName!
echo Outsuf2 !OutSuf2!
    set OutFile=!OutPerf!!StoreNo!!OutSuf1!!StoreName!!OutSuf2!
echo %%f !OutFile!
pause
REM move %%f c:\Oscar\Scripts\FileNamer\Outbound\!OutFile!
)
cd c:\Oscar\Scripts\FileNamer\
exit /b

:getpos
set stemp=!InAddLine!
set pos=0
:loop
set /a pos+=1
echo !stemp!|findstr /b /c:"!MatchStr!" >NUL
if errorlevel 1 (
        set stemp=!stemp:~1!
        if defined stemp GOTO loop
        set pos=0
        )
set /a pos-=3
goto:eof

:getvalue
rem This function reads a value from a file and stored it in a variable
rem %1 = name of file to search in
rem %2 = search term to look for
rem %3 = variable to place search result
FOR /F "tokens=1,2* delims==" %%i in ('findstr /b /l /i %~2= %1') DO set %~3=%%~j
goto:eof

1 个答案:

答案 0 :(得分:0)

感谢大家的投入,这里有完成的脚本以及更多更新。

使用pdftotext.exe作为免费软件xpdf套件的一部分(请捐赠,因为它是一个很棒的实用工具),在这种情况下,一些查找文件可以帮助解决网站编号的描述。格式为 001 =我的城镇

我完全没能找到一个可行的方法来填充2位数的站点代码,前导0使所有站点都成为3位数,但最后用另一个查找文件做同样的事情!

我希望这对其他人有用!

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET OutPref=373137#
SET OutSuf1=#My Text 
SET OutSuf2=#1520755.pdf
SET MatchStr=@mydomain.com
SET BaseDir=C:\myfolder\
SET LogFile=C:\myfolder\FileNamer.log
SET InFolder=C:\myfolder\Inbound\
SET OutFolder=C:\myfolder\Outbound\
SET StoreList=C:\myfolder\StoreList.inf
SET StoreNoConv=C:\myfolder\StoreNoConv.inf

echo Starting Run %TIME% %DATE% >> %LogFile%
echo Starting Run %TIME% %DATE%
cd %InFolder%
for /f "tokens=*" %%f in ('dir /b *.pdf') do (
    %BaseDir%pdftotext.exe -q %%f
    set "InTxtVer=%%~nf.txt"
    for /f "tokens=*" %%x in ('findstr !MatchStr! !InTxtVer!') do set InAddLine=%%x
    call:getpos
    call set StoreNo=%%InAddLine:~!pos!,-25%%
    echo Now Renaming Store No !StoreNo!
    call:getvalue %StoreList% !StoreNo! StoreName
    call:getvalue %StoreNoConv% !StoreNo! ThreeDigitNo
    set OutFile=!OutPref!Store!ThreeDigitNo!!OutSuf1!!StoreName!!OutSuf2!
    echo %%f moved to !OutFile! >> %LogFile%
    move "%%f" "%OutFolder%!OutFile!" >> %LogFile%
    del !InTxtVer!
)

cd %BaseDir%
exit /b



:getpos
set stemp=!InAddLine!
set pos=0
:loop
set /a pos+=1
echo !stemp!|findstr /b /c:"!MatchStr!" >NUL
if errorlevel 1 (
        set stemp=!stemp:~1!
        if defined stemp GOTO loop
        set pos=0
        )
set /a pos-=4
goto:eof

:getvalue
rem This function reads a value from a file and stores it in a variable
rem %1 = name of file to search in
rem %2 = search term to look for
rem %3 = variable to set search result under
FOR /F "tokens=1,2* delims==" %%i in ('findstr /b /l /i %~2= %1') DO set %~3=%%~j
goto:eof