批量打印 - 批处理脚本 - for循环中的findstr条件

时间:2012-03-14 01:18:36

标签: ftp batch-file

我的问题是下载pdf文件并将所有文件发送到打印机。

我通过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一次?

由于

2 个答案:

答案 0 :(得分:3)

您的问题是%errorlevel%值是在for内部获取的,因此在进入for循环之前,它被替换。要获取errorlevel在每个迭代中具有当前,您必须使用延迟变量扩展,即将值括在感叹号中而不是百分比:!errorlevel!并在程序开头插入此行:

setlocal EnableDelayedExpansion

为了更清楚地解决这个问题,请尝试以下方法:

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

然后再次尝试按echo %name%更改echo !name!

答案 1 :(得分:0)

要考虑的一些想法:

  1. 我不确定FINDSTR命令之后的errorlevel是否因为找不到字符串而变为非零。
  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中使用独特的技术。
  6. dir/b C:\Users\print_test2\print_%mm%_%yy%\*.pdf >> C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt