0

我在处理循环批处理文件中的变量时遇到了一些困难。当我认为我把它搞砸时,我发现了一个例子,它不能像我预期的那样工作,我觉得我一直在绕圈子......

我已经编写了全部代码,以防它有所作为,基本上我有一个包含许多子文件夹的存档文件夹,我想检查我的上传数据(将在脚本末尾移动到存档文件夹)当我让这部分工作时写)已经被处理了。如果是这样,请移至带有日期的 Duplicates 文件夹:

 @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 文件夹。

谢谢。

4

1 回答 1

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 进行测试,因此需要更改驱动器号,以及错误日志位置。

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

我已将您更改COPY为 aMOVE以匹配您的叙述。无论哪种方式,>nul如果您希望禁止显示“已复制/移动的 1 个文件”消息,则附加到命令的 a 应禁止显示。

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

最后的三个“rmdir/RD”旨在删除任何具有目标名称的空子目录。

于 2013-08-07T16:29:05.110 回答