2012-03-14 91 views
0

我手边的问题是下载pdf文件并将它们全部发送到打印机。批处理打印 - 批处理脚本 - fortr循环中的findstr条件

我通过FTP下载正确的所有文件进入我的本地目录:然后

文件名= FtpScript.ftp

open ftp.domain.com 
username 
password 
!:--- FTP commands below here --- 
lcd local/Directory 
cd /remote/Directory 
binary 
mget "*.pdf" 
prompt 
disconnect 
quit 

此批处理文件调用FTP脚本。

文件名= retrieve_print.bat

@ftp -i -s:"C:\Scripts\FtpScript.ftp" 

set mm=%date:~4,2% 
set dd=%date:~7,2% 
set yy=%date:~-4% 

IF NOT EXIST {C:\Users\print_test2\print_%mm%_%yy%}(mkdir C:\Users\print_test2\print_%mm%_%yy%) 

IF NOT EXIST C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt ( 
    @echo Uploaded Text -- Date: %date% Time : %time% >>  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
) 
IF NOT EXIST  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt ( 
    @echo Printed Text -- Date: %date% Time : %time% >>  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
) 

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND INSERT THE NAMES INTO THE UPLOADED_*_*.txt TEXT  FILE 
FOR %%x in ( C:\Users\print_test2\print_%mm%_%yy%\*.pdf) DO  (
    findstr "%%~nxx"  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
    @ECHO Error level = %errorlevel% 
    @ECHO %%~nxx 
    @pause 
    IF NOT %errorlevel% == 0 (
     @echo %%~nxx >>  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
    ) 
) 

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND PRINT THEM, THEN INSERT THEM INTO THE PRINTED_*_*.txt TEXT FILE TO SUPPRESS DUPLICATE PRINTS 
FOR %%x in ( C:\Users\print_test2\print_%mm%_%yy%\*.pdf) DO  (
    findstr "%%~nxx"  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
    @ECHO Error level = %errorlevel% 
    @ECHO %%~nxx 
    IF NOT %errorlevel% == 0 (
     rem PRINT FUNCTION 
     @echo %%~nxx >>  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
    ) 
) 

的文本文件产生不正确。我的想法是,我可以通过print_test2/print_%mm%_%yy%目录中可用的文件遍历通过ftp接收的所有文件并将其记录到文本文件中。

当我尝试在文本文件中有文件名时再次运行脚本时,问题就变得很明显。我期望findstr函数返回%errorlevel%为0,但它不检测文本文件中的字符串,并在我上传和打印的文本文件中再次附加所有文件名。

是否有更好的方式记录收到的文件并只打印一次pdf?

感谢

回答

3

你的问题是,%errorlevel%值取里面的,所以它是由价值ERRORLEVEL取代了之前进入for循环。采取当前值ERRORLEVEL在每个迭代必须使用变量延迟扩展有,即,请用感叹号的值,而不是百分比:!errorlevel!和在程序的begining插入此行:

setlocal EnableDelayedExpansion 

为了使这个问题更清楚,试试这个:

set name=Value before FOR 
for %%f in (*.pdf) do (
    set name=%%f 
    echo %name% 
) 

,然后再次尝试通过改变echo !name!echo %name%

+0

花了一些时间与此循环,并不知道发生了什么事情。这完全解决了我的错误。谢谢你的帮助Aacini。 – Alex 2012-03-14 19:18:20

0

有一些想法,认为:

  1. 我不知道你的FINDSTR命令后,错误级别将是仅仅因为未找到字符串非零。
  2. 即使errorlevel不为零,我认为执行下一个命令的那一刻,该命令的新错误级别就会被设置。
  3. 在您的IF语句中,您可能需要将平等检查的两边用分隔符分隔。 IF NOT "%errorlevel%" == "0"
  4. 您可能会考虑在您将所有文件名回显后将列表分隔开来。它会为你节省一些逻辑。在DOS中有一些使列表不同的代码在这里描述:http://www.dullsharpness.com/2010/10/01/create-a-distinct-ordered-list-from-an-unordered-duplicate-list-using-ms-dos/
  5. 如果你使用#4的技术,你可以在你的文件中做一个目录列表(如接下来),然后在#4中使用独特的使用技巧。

dir/b C:\Users\print_test2\print_%mm%_%yy%\*.pdf >> C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt

+0

1.是的,如果未找到该字符串,FINDSTR将返回一个非零的错误级别值。 2.在.BAT文件中,ECHO和PAUSE命令不会修改错误级别。 3.比较错误级别值时,不需要分隔符,只有当值可能包含空格或其他特殊字符时。 – Aacini 2012-03-14 03:05:06

+0

Hey Marc,4中的技巧很好地解释了setlocal EnableDelayedExpansion。特别是使用http://www.robvanderwoude.com/variableexpansion.php。谢谢! – Alex 2012-03-14 19:26:56