循环批处理文件,命名具有标题,日期和时间的子文件夹

时间:2017-09-18 23:00:47

标签: windows date batch-file optimization time

(TLDR见最后一段)

在下面的代码中,我拼凑了来自本论坛和其他人的其他主题的信息。我是这个代码/语言的新手,所以我不知道如何优化这个。

以下是我尝试使用此代码实现的目标。

脚本输出到.log而不是命令窗口
:顶部
脚本在“M:\ AnalysisDrop \”中搜索.dat文件 如果检测到.dat文件(
脚本自动创建一个子文件夹“M:\ AnalysisDrop \ title_date_time”
文件被移入文件夹
使用程序C:\ Analysis \ Analysis.exe打开文件 )
等5秒钟 转到顶部(永远重复)

这个脚本会不断重复我希望很长一段时间。我会遇到太多“设置”命令的问题吗?我在执行“SETLOCAL EnableDelayedExpansion”和SETLOCAL DisableDelayedExpansion

时遇到了一些问题
@Echo off
echo Script 1 Initiated
@echo on
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set datetime1=%datetime:~0,8%_%datetime:~8,6%
SETLOCAL EnableDelayedExpansion
SET LOGFILE=Script1_LOG_%datetime1%.log
call :top >> %LOGFILE% 
exit /b 0
:top
for %%f in (*.dat) do (
set datetime1=%datetime:~0,8%_%datetime:~8,6%
set foldername=%%~nf_%datetime1%
md "!foldername!"
move "M:\AnalysisDrop\%%~nf*.dat*" "M:\AnalysisDrop\%%~nf_%datetime1%\"
pushd M:\AnalysisDrop\%%~nf_%datetime1%\
C:\Analysis\Analysis.exe '%%~nf.dat'
popd
)
timeout /t 5 /nobreak
goto top
exit /b 0

老实说,我不需要“for”循环,但我不知道该怎么做(试图用“if”替换“for”,没有成功。另外,“datetime1”变量不会更新,所以如果我尝试运行多个同名的.dat文件,它会在同一个子文件夹中写入前一个文件,我可以使用但不喜欢这样。

所以澄清我的问题:
1.如果没有“for”循环,我该怎么做?我知道这可能导致我的datetime变量问题没有更新。
2.我使用“goto”命令来连续循环这个脚本,我应该使用不同的东西吗?

2 个答案:

答案 0 :(得分:0)

在@compo的帮助下回答我的问题。我不知道我需要循环中的for \f...语句以及set datetime2。我需要在for循环中将%datetime...%更改为!datetime...!。请参阅下面的固定代码。

在回应@Gerhard Barnard时,%time%%date%的格式不是我可以为目录命名的。

@Echo off
echo Script 2 Initiated
@echo on
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set datetime2=%datetime:~0,8%_%datetime:~8,6%
SETLOCAL EnableDelayedExpansion 
SET LOGFILE=Script2_LOG_%datetime2%.log
call :top >> %LOGFILE% 
:top

for %%f in (*.dat) do (

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set datetime2=!datetime:~0,8!_!datetime:~8,6!
set foldername=%%~nf_!datetime2!
md "!foldername!"
move "M:\AnalysisDrop\%%~nf*.dat*" "M:\AnalysisDrop\!foldername!\"
pushd M:\AnalysisDrop\!foldername!\
C:\Analysis\Analysis.exe '%%~nf.dat'
popd

)

timeout /t 5 /nobreak
goto top
exit /b 0

答案 1 :(得分:0)

我希望基于原始代码,帮助您构建脚本:

@Echo Off
Rem Enabling delayed expansion
SetLocal EnableDelayedExpansion
Rem Setting current directory
If /I Not "%CD%"=="M:\AnalysisDrop" (CD /D "M:\AnalysisDrop" 2>Nul||Exit/B)
Rem Setting date and time variable for log file name
Call :GetLDT
Rem Call Main section outputting to log file
Call :Main>>"Script1_LOG_%LDT%.log"
Rem Exit script
Exit/B

Rem Main section
:Main
Rem Loop over each matching file in the current directory
For %%A In (*.dat) Do (
    Rem Setting date and time variable for destination directory name
    Call :GetLDT
    Rem Create directory if it does not exist
    If Not Exist "%%~nA_!LDT!\" MD "%%~nA_!LDT!"
    Rem Move file to directory
    Move "%%~A" "%%~nA_!LDT!"
    Rem Run analysis against file in destination
    Start "" /D "%%~nA_!LDT!" /W "C:\Analysis\Analysis.exe" '%%~A'
)
Rem Create a delay 
Timeout 5 /NoBreak>Nul
Rem Re-run Main section in loop 
GoTo Main

Rem GetLDT section
:GetLDT
Rem Setting date and time string
For /F "EOL=L" %%A In ('WMIC OS GET LocalDateTime') Do For %%B In (%%~nA
) Do Set "LDT=%%B"
Rem Formatting string as required
Set "LDT=%LDT:~,8%_%LDT:~-6%"
Rem Return to point after Call
GoTo :EOF

使用'%%~A'的命令看起来与单引号有关,但我会留给您决定。