【发布时间】:2013-08-08 01:34:32
【问题描述】:
我很难理解循环批处理文件中的变量。当我认为我搞砸了时,我发现了一个例子,它没有按我的预期工作,我觉得我一直在绕圈子......
我已经编写了我的全部代码,以防它有所作为,基本上我有一个包含许多子文件夹的存档文件夹,我想检查我的上传数据(将在末尾移动到存档文件夹脚本 - 当我让这部分工作时编写)已经被处理。如果是这样,请移至带有日期的 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 文件夹。
谢谢。
【问题讨论】:
-
Endoro 已经解决了这个问题,但是有几个 cmets:您将
"%~nxf"视为VariableTemp的值这一事实表明之前的运行已将VariableTemp设置为该值。与大多数语言不同,批处理继承了在同一cmd会话中运行的先前程序的变量。批处理程序所做的任何更改都将保留在原地,直到再次特别更改 - 除非在setlocal和endlocal(或文件结束/程序)之间进行更改,此时环境恢复到其状态当setlocal被执行时。 -
下一期是风格问题。
IF NOT EXIST "dirname"肯定有效,但md "dirname" 2>nul将创建一个目录,如果它不存在,2>nul会转储“它已经存在”消息。将这个INSIDE放在循环中没有什么意义,因为目标目录名称在循环中不会改变。md/mkdir(它们是同义词)应该移出循环 - 在FOR之前 - 完成一次,而不是(可能)多次。最后,IF EXIST /R名义上不是有效的语法。它的目的是什么? -
感谢您的提示!我添加 /R 的原因是因为没有它,脚本似乎不会遍历子文件夹 - “Duplicates”文件夹是使用 /R 创建的,但如果我删除它则不会。老实说,我更多地使用反复试验而不是正确理解来构建它,所以这些答案非常棒。谢谢!
标签: for-loop batch-file environment-variables