batch-file - 批处理命令根据值列表检查值
问题描述
我正在尝试创建一个批处理文件,该文件根据月份的数字日期将文件复制到特定目录。如果变量是 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
)
有什么想法或建议吗?谢谢。
解决方案
这一切都在一起:
@(
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/7
through6/7
将返回0
,但7/7
将返回1
,但是,我们希望1/7
通过7/7
返回1
和8/7
通过14/7
返回2
,如您的请求中所述。为此,我们将 6 添加到执行时找到的初始日期值检查,这会导致在1/7
through7/7
上执行的实际算术是7/7
through 14/7
,这将返回1
. 并且8/7
虽然14/7
实际检查将是14/7
through20/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#!\"
)
推荐阅读
- android - Android 文本滚动不适用于 Scrollview 和 Textview
- vba - GoTo 上的语法错误“On Error GoTo [label]”行
- apache-spark - 谁执行pyspark中的python代码
- php - AWS - Cognito - AdminSetUserPassword 返回“找不到操作:AdminSetUserPassword”
- json - 将 JSON 解压缩为平面格式
- linux - 如何使用 parted 编写自动任务脚本(更新 gpt 表)
- c# - 是否可以使用 Rest API 在代码中在 SharePoint Online 中创建文档库?
- rest - YYYYMMDD yaml 定义上的日期格式
- javascript - jQuery each() 方法不适用于附加元素
- python - 需要帮助检测与背景颜色几乎相似的曲线