首页 > 解决方案 > 批处理命令根据值列表检查值

问题描述

我正在尝试创建一个批处理文件,该文件根据月份的数字日期将文件复制到特定目录。如果变量是 01 到 07,则复制到 Week1,如果是 08 到 14,则复制到 Week2,等等。我想没有什么比 IN 命令更能尝试这个了。

setlocal ENABLEDELAYEDEXPANSION
for %%I in (\\01mtsdv130\CMApps\Log\EnhancedLogging\*.*) do (
   set thedate=!folder:~11,2!
   set mydate=!folder:~5,6!

   if "!thedate!"=="01" (
       copy %%I c:\holdlogs\01mtsdv130\"!mydate!"\Week1\
   )
   if "!thedate!"=="02" (
       copy %%I c:\holdlogs\01mtsdv130\"!mydate!"\Week1\
   )

    ... etc
)

有什么想法或建议吗?谢谢。

标签: batch-file

解决方案


这一切都在一起:

@(
  setlocal ENABLEDELAYEDEXPANSION
  ECHO OFF
)
SET "_Folder=Your folder Goes here"
SET "_TheDate=%_folder:~11,2%"
SET "_MyDate=%_folder:~5,6%"
SET /A "_TheDate#=1!%TheDate% - ( 2%TheDate% - 1%TheDate% )"
SET /A "_TheWeek#=( ( %_TheDate#% + 6 ) / 7) "

FOR %%I IN (
  "\\01mtsdv130\CMApps\Log\EnhancedLogging\*.*"
) DO (
  Copy /B /V /Y "%%~fI" "c:\holdlogs\01mtsdv130\%_MyDate%\Week%_TheWeek#%\"
)

详情/原帖:

由于您的周是连续的集合,您可以使用除法运算对它们进行分组,方法是查找除法的乘积并调用标签或为每个星期设置单独的 IF 代码。

现在,您没有在Folder任何地方定义变量,是否应该在每次循环中都相同?\

如果是这样,请将其设置在您的循环之外!

由于这是在外部设置的,并且您从中获取日期值,因此所有内容也可以在外部设置,您也可以选择在循环外部复制的位置。

@(
  setlocal ENABLEDELAYEDEXPANSION
  ECHO OFF
)
SET "_Folder=Your folder Goes here"
SET "_TheDate=%_folder:~11,2%"
SET "_MyDate=%_folder:~5,6%"

您需要查看没有任何前导 0 的日期值以使用该方法进行一些比较,这相当简单,我们可以保存该值_TheDate#,以防您需要原始值。

SET /A "_TheDate#=1%TheDate% - ( 2%TheDate% - 1%TheDate% )"

尽管在您的情况下您可以使用更具体的SET /A "_TheDate#=1%TheDate% - 100"我更喜欢上面更通用的解决方案,因为它适用于需要剥离的任意数量的前导 0(只要它小于 2 时 CMD 中的 32 位整数限制放在前面。)

然后我们可以得到星期:

SET /A "_TheWeek#=( ( %_TheDate#% + 6 ) / 7) "

注意我们如何添加 6?为什么?为您提供支持周(这是因为0/7through6/7将返回0,但7/7将返回1,但是,我们希望1/7通过7/7返回18/7通过14/7返回2,如您的请求中所述。为此,我们将 6 添加到执行时找到的初始日期值检查,这会导致在1/7through7/7上执行的实际算术是7/7through 14/7,这将返回1. 并且8/7虽然14/7实际检查将是14/7through20/7并返回 2 等)

现在看起来你真的想复制到一个名为 WEEK1 Week2 3 等的文件夹中

所以这已经准备好使用你现有的循环了:

for %%I in (\\01mtsdv130\CMApps\Log\EnhancedLogging\*.*) do (
  copy /B /V /Y "%%~fI" "c:\holdlogs\01mtsdv130\%MyDate%\Week%_Week#%\"
)

这一切都在一起:

@(
  setlocal
  ECHO OFF
)
SET "_Folder=Your folder Goes here"
SET "_TheDate=%_folder:~11,2%"
SET "_MyDate=%_folder:~5,6%"
SET /A "_TheDate#=1%TheDate% - ( 2%TheDate% - 1%TheDate% )"
SET /A "_TheWeek#=( ( %_TheDate#% + 6 ) / 7) "

FOR %%I IN (
  \\01mtsdv130\CMApps\Log\EnhancedLogging\*.*
) DO (
  Copy /B /V /Y "%%~fI" "c:\holdlogs\01mtsdv130\%_MyDate%\Week%_TheWeek#%\"
)

如果您需要在每次循环迭代中获取和设置值:

在这种情况下,我们实际上最终会使用延迟扩展。

@(
  setlocal ENABLEDELAYEDEXPANSION
  ECHO OFF
)


FOR %%I IN (
  "\\01mtsdv130\CMApps\Log\EnhancedLogging\*.*"
) DO (
  SET "_Folder=Set from something you are looping I suppose?"
  SET "_TheDate=%_folder:~11,2%"
  SET "_MyDate=%_folder:~5,6%"
  SET /A "_TheDate#=1!TheDate! - ( 2!TheDate! - 1!TheDate! )"
  SET /A "_TheWeek#=( ( !_TheDate#! + 6 ) / 7) "
  Copy /B /V /Y "%%~fI" "c:\holdlogs\01mtsdv130\!_MyDate!\Week!_TheWeek#!\"
)

推荐阅读