循环适用于第一个文件,然后失败

时间:2019-07-15 12:24:57

标签: batch-file for-loop

在脚本编写方面,我是一个新手,但是我试图编写一个批处理脚本,该脚本运行一个命令以将png文件输出到打印机。我拥有的脚本可以很好地处理一个文件,但是当有多个文件时却不能。

有人可以指出我的正确方向吗?

@echo off
REM ___Change Directory to where Label Is Stored___
pushd C:\AFP\to
REM ___Create Variable to capture filename of any png file___
for /F %%a in ('dir /b *.png') do set FileName=%%~na.png
REM ___Now we have the filename as a variable, send it to printer using Zebra SSDAL___
\\172.16.100.2\nDrive\Prime_DPD_Label_Print\ssdal.exe /p "TSC DA200" send %FileName% >> C:\AFP\Log\Label_Printing_Log.txt
REM ___Copy PNG File to Backup Folder___
XCOPY /y /q /c C:\AFP\to\*.png C:\AFP\backup\
REM ___Delete PNF File from To Folder___
DEL C:\AFP\to\*.png

脚本运行时,第一个文件可以正常打印。随后的文件然后不打印,我从ssdal.exe命令得到“文件不存在”。为什么第一个作品可以工作,但随后的作品却不能工作?我希望for能够循环通过。

1 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL
REM ___Change Directory to where Label Is Stored___
pushd C:\AFP\to
REM ___Process all png files___
for /F "delims=" %%a in ('dir /b *.png') do (
 REM ___Now we have the filename as "%%a", send it to printer using Zebra SSDAL___
 \\172.16.100.2\nDrive\Prime_DPD_Label_Print\ssdal.exe /p "TSC DA200" send "%%a" >> C:\AFP\Log\Label_Printing_Log.txt
 IF ERRORLEVEL 1 (
  CALL ECHO SSDAL returned ERRORLEVEL %%errorlevel%% FOR "%%a"
 ) ELSE (
  REM ___Move PNG File to Backup Folder___
  IF EXIST "c:\afp\backup\%%a" (
   ECHO MOVE "%%a" to backup skipped as file already exists IN backup
  ) ELSE (
   MOVE "%%a" C:\AFP\backup\
  )
 )
)
POPD

GOTO :EOF

啊!使用Zebra打印机。小伙子!

此替换脚本应执行您想要的操作。

使用setlocal命令来确保该批处理在批处理结束时对cmd环境所做的任何更改都被丢弃。

delims=设置为“无定界符”,因此for/f会将%%a设置为整个文件名,即使它包含空格或其他定界符。引用%%a可确保将这些文件名作为一个单位保存在一起,而不是被解释为单独的标记。

我假设ssdal负责任,在发生错误的情况下返回errorlevel非零。 if errorlevel 1表示错误级别当前是否为1 或大于1 ,在这种情况下,将生成错误消息。如果我们不使用call echo ... %%varname%% ...,则需要delayed expansion来显示变量的 current 值(许多SO文章对此进行了解释)

否则,如果ssdal成功,请检查backup目录中文件名是否存在,然后move在该文件名中或报告其已经存在。

当然,如果不需要我添加的功能,可以通过多种方法进行操作。我很高兴对此脚本进行调整以符合要求。