for循环中的批处理文件变量

时间:2013-08-06 21:03:14

标签: for-loop batch-file environment-variables

我在批量处理循环中的变量时遇到了一些困难。当我认为我把它弄下来的时候,我会找到一个例子,它不会像我期望的那样起作用,而且我觉得我一直在用这个... ...

我已经编写了我的全部代码,因为它有所不同,基本上我有一个包含许多子文件夹的存档文件夹,我想检查我的上传数据(它将被移动到存档文件夹的末尾)脚本 - 当我使这部分工作时写入)已经处理完毕。如果是这样,请移至带有日期的重复项目文件夹:

 @echo off

 for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set localDT=%%j
 set localYYYY=%localDT:~0,4%
 set localMM=%localDT:~4,2%
 set localDD=%localDT:~6,2%
 set localDate=%localYYYY%-%localMM%-%localDD%
 set localTime=%localDT:~8,2%:%localDT:~10,2%

 for %%f in ("C:\Test\837Store\*.837") DO if exist /R "C:\Test\Archive\%%~nxf" (
     set VariableTemp=%%~nxf
     echo %VariableTemp%
     IF NOT EXIST "C:\Test\Archive\Duplicates" mkdir "C:\Test\Archive\Duplicates"
     IF NOT EXIST "C:\Test\Archive\Duplicates\%localYYYY%" mkdir "C:\Test\Archive\Duplicates\%localYYYY%"
     IF NOT EXIST "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%" mkdir "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%"
     copy "%%~nxf" "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%"
     echo %localDate% %localTime%        Duplicate claims file: %%~dpnxf File moved to archive     >> "C:\Test\Log\Error.log"
 )
 pause

我的问题是,变量%% f似乎没有通过循环设置。运行mkdir命令,但是当我们到达副本时,我收到“找不到文件”错误。为了试着看看发生了什么,我包含了VariableTemp并根据代码进行设置,期望看到文件的名称和扩展名。相反,我的回音是打印“%~nxf”

有谁能帮我理解这些变量是如何工作的?为什么我没有看到837Store中的文件名?

仅供参考,我在C:\ Test \ 837Store中有以下2个文件:

1.837 2.837

我在C:\ Test \ Archive \ 2013 \ 08中有相同的2个文件,所以希望它们从837Store移动到相关的Duplicates文件夹。

感谢。

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set localDT=%%j
set localYYYY=%localDT:~0,4%
set localMM=%localDT:~4,2%
set localDD=%localDT:~6,2%
set localDate=%localYYYY%-%localMM%-%localDD%
set localTime=%localDT:~8,2%:%localDT:~10,2%

mkdir "U:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 2>nul


for /R U:\Test\837Store %%f in (*.837) DO ECHO processing %%~ff&if exist "U:\Test\Archive\%%~nxf" (
 IF EXIST "u:\Test\Archive\Duplicates\%localYYYY%\%localMM%\%%~nxf" (
  echo %localDate% %localTime%        Duplicate claims file: %%~dpnxf File ALREADY DUPLICATED   >> "u:\Error.log"
 ) ELSE (
  MOVE "%%~ff" "u:\Test\Archive\Duplicates\%localYYYY%\%localMM%"
  echo %localDate% %localTime%        Duplicate claims file: %%~dpnxf File moved to archive     >> "u:\Error.log"
 )
)
rmdir "U:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 2>nul
rmdir "U:\Test\Archive\Duplicates\%localYYYY%" 2>nul
rmdir "U:\Test\Archive\Duplicates" 2>nul
GOTO :EOF

这是我的解释。

我已经使用我的RAMdrive进行测试,因此需要更改driveletter,以及错误日志位置。

我已经为已经存在的重复添加了额外的测试 - 只报告这种情况。

我已将您的COPY更改为MOVE以符合您的叙述。无论哪种方式,如果您希望它被抑制,那么附加到命令的>nul应该禁止“1个文件复制/移动”消息。

MD/MKDIR将在目标上方创建任何必要的子目录。

最后的三个'rmdir / RD`旨在删除任何带有目标名称的空子目录。