我的任务是创建一个脚本,将文件夹中的日期子文件夹复制到另一个位置。基本文件夹命名为16个十六进制字符,每个文件夹都有一个年份的文件夹,在月份的文件夹中,在里面有一个日期的文件夹,其中包含我需要复制的二进制(转储)文件。我关心的两个月大约有50个文件夹大约5天(现在),所以我想要捕获如下内容: C:\ DUMPS \ 2401010153783FB6 \ 2016 \ 09 \ 29 * *
而不是做大量的copypaste脚本或手动尝试获取我想要的所有文件夹(人为容易出错),我想我应该能够创建一个BAT文件来循环遍历文件夹名称数组并获取我关心的文件。我在以下用户DSS的答案中找到了一个非常有用的部分: How to loop through array in batch?
我的问题是他的示例显示了如何使用CALL ECHO而不仅仅是ECHO,但我想将字符串值用作文件夹名称的一部分,而不仅仅是打印到控制台。这是我开发的正在进行中的代码:
SET COPYPATH=C:\Dumps
SET DESTPATH=D:\NewDumps
SET FOLDERNAME[0]=2401010153783FB6
SET FOLDERNAME[1]=2401010753BBBBCE
SET "X=0"
:Looping
IF DEFINED FOLDERNAME[%X%] (
CALL ECHO %%FOLDERNAME[%X%]%% REM Works great, I see the value of FOLDERNAME[0] on console.
SET TEMPVAR= CALL ECHO %%FOLDERNAME[%X%]%% REM No good! Result is CALL ECHO.
SET TEMPVAR= CALL %%FOLDERNAME[%X%]%% REM No good! Result is CALL X.
SET TEMPVAR= %FOLDERNAME[%X%]% REM No good! Result is literal FOLDERNAME[0]; I want the value of FOLDERNAME[0].
IF EXIST %TEMPVAR%\2016\09\28 (
COPY %TEMPVAR%\2016\09\28 %DESTPATH%\%FOLDERNAME[%X%]%%\2016\09\28
)
IF EXIST %COPYPATH%\%FOLDERNAME%\2016\09\29 (
COPY %COPYPATH%\%FOLDERNAME%\2016\09\29 %DESTPATH%\%FOLDERNAME%\2016\09\29
)
IF EXIST %COPYPATH%\%FOLDERNAME%\2016\09\30 (
COPY %COPYPATH%\%FOLDERNAME%\2016\09\30 %DESTPATH%\%FOLDERNAME%\2016\09\30
)
IF EXIST %COPYPATH%\%FOLDERNAME%\2016\10\01 (
COPY %COPYPATH%\%FOLDERNAME%\2016\10\01 %DESTPATH%\%FOLDERNAME%\2016\10\01
)
IF EXIST %COPYPATH%\%FOLDERNAME%\2016\10\02 (
COPY %COPYPATH%\%FOLDERNAME%\2016\10\02 %DESTPATH%\%FOLDERNAME%\2016\10\02
)
SET /A "X+=1"
GOTO :Looping
)
我可以在任一路径中使用临时变量,或者我可以使用连接的%COPYPATH%\%FOLDERNAME%语法(当我将其设置为一次性测试时有效,但现在我想要循环它50次)。任何建议都非常感谢!
答案 0 :(得分:0)
怎么样
for /L %%a in (0,1,1) do (
for %%b in (2016) do (
for %%c in ("09 28" "09 29" "09 30" "10 01" "10 02") do (
call :sub %%a %%b %%~c
)
)
)
...whatever, etc...
goto :eof
:sub
call set "foldername=%%foldername[%1]%%"
IF EXIST %COPYPATH%\%FOLDERNAME%\%2\%3\%4 (
echo COPY %COPYPATH%\%FOLDERNAME%\%2\%3\%4 %DESTPATH%\%FOLDERNAME%\%2\%3\%4
)
goto :eof
其中echo
用于显示建议的内容,请删除要执行的echo
关键字。
请注意,您没有解释为什么要在代码中从tempname
切换到copypath\foldername
,因此我认为它的替换不完整。
答案 1 :(得分:0)
怎么样......
@echo off
setlocal enabledelayedexpansion
SET "COPYPATH=C:\Dumps"
SET "DESTPATH=D:\NewDumps"
SET "FOLDERNAME[0]=2401010153783FB6"
SET "FOLDERNAME[1]=2401010753BBBBCE"
rem set start to first item index, stop to last
SET/a start=0, stop=1
SET "DAYS=2016\09\28,2016\09\30,2016\10\01"
for /L %%i in (%start%,1,%stop%) do (
echo !FOLDERNAME[%%i]!
set "TEMPVAR=%COPYPATH%\!FOLDERNAME[%%i]!"
set "DESTVAR=%DESTPATH%\!FOLDERNAME[%%i]!"
for %%d in (%DAYS%) do (
rem if it works, remove echo from line below
IF EXIST "!TEMPVAR!\%%d" echo COPY "!TEMPVAR!\%%d" "!DESTPATH!\%%d"
)
)
exit /B
答案 2 :(得分:0)
我想你所有人:
SET TEMPVAR=....
试图将命令的结果保存到变量中
好吧,我不得不让你失望......没有可能(还)将命令的结果直接分配给可靠的批处理(对不起)。存在间接方式:for /f
- 循环,使用临时文件,......但它们可能会使您的代码更复杂
您正在寻找的命令是
call set tempvar=%%foldername[%x%]%%
call
用于执行您在批处理文件中作为参数给出的命令。
所以命令看起来像(假设x=0
)set tempvar=%foldername[0]%
,调用将执行该命令(如果x=0
偏离...)。
PS:如果您考虑使用延迟扩展,请考虑@Magoo's answer改进批处理脚本和@elzooilogico。