Windows cmd编程中的速度和时间问题

Windows cmd编程中的速度和时间问题,windows,batch-file,cmd,Windows,Batch File,Cmd,最近出现了一个问题,关于将具有用户预定义文件类型扩展名的多个文件从一个文件夹移动到多个不同的文件夹,这些文件夹是根据文件名中的键字符串(年份)立即创建的。此外,当移动到新创建的文件夹时,应保存文件而不使用用户预定义的文件类型扩展名(文件名2016.myextension.txt>文件名2016.txt)。我对这个问题很感兴趣,所以我创建了一个简单的cmd程序 有两个问题: 程序运行正常,但速度太慢 有没有办法让它跑得更快 ECHO%TIME%命令位于(1900,12099)循环中的for/l%%

最近出现了一个问题,关于将具有用户预定义文件类型扩展名的多个文件从一个文件夹移动到多个不同的文件夹,这些文件夹是根据文件名中的键字符串(年份)立即创建的。此外,当移动到新创建的文件夹时,应保存文件而不使用用户预定义的文件类型扩展名(文件名
2016.myextension.txt
>文件名
2016.txt
)。我对这个问题很感兴趣,所以我创建了一个简单的cmd程序

有两个问题:

程序运行正常,但速度太慢

有没有办法让它跑得更快

ECHO%TIME%
命令位于(1900,12099)循环中的
for/l%%A,查看程序代码的末尾,始终返回相同的时间值

有没有办法让它返回正确的当前系统时间

以下是程序代码:

rem program start
rem 
rem use double % for cmd line parameters when generating .bat
rem use single % for cmd line parameters for direct cmd execution 
rem use ^ for cmd line brake
rem
rem
rem change command prompt attributes
rem 
echo off
mode con:cols=80 lines=40
title Program
color 0A
cls
echo.
echo Program start running at... %TIME%
echo.
rem set local variables value 
setlocal EnableDelayedExpansion EnableExtensions
set old_folder_path=C:\Torrent_files\
set new_folder_path=C:\Torrent_movies\
set folder_path=C:\Torrent_movies\Year_
set f1=.
set f2=.
set list_path_extension=C:\Torrent_movies\Torrent_list.txt
set extension=.torrent
rem create root folder for new movie folders
if not exist %new_folder_path% (echo Creating Torrent_movies folder... && ^
md %new_folder_path% && echo Done at... %TIME%)
echo.
rem set current directory to new_folder_path
cd %new_folder_path%
rem create new list 
rem of torrent files inside the folder
echo Creating empty List of files...
echo. > %list_path_extension%
echo Done at... %TIME%
echo.
rem Fill List of files
echo Filling List with file names...
for /r %old_folder_path% %%T in (*%extension%) do (^
set f1=%%T && ^
set f2=!f1:%old_folder_path%=! && ^
echo !f2! >> %list_path_extension%)
echo Done at... %TIME%
echo.
rem search for year inside file paths saved in Torrent_list.txt file
rem by using for loop, where value of cmd parameter 
rem A goes from year 1900 up to 2099, 
rem if there is match between string value of A as a regular expression, 
rem and string inside file path, create new folder for that year
rem else skip
echo Moving files
for /l %%A in (1900,1,2099) do (^
for /f "tokens=*" %%G in ('findstr /r "\<%%A" %list_path_extension%') do (^
(if exist %folder_path%%%A (echo.) ^
else (md %folder_path%%%A && echo %folder_path%%%A   Folder created)) && ^
echo Moving file %%G && set f1=%%G && set f2=!f1:%extension%=! && ^
move "%old_folder_path%%%G" "%folder_path%%%A\!f2!" && echo Done at... %TIME% && echo.))
rem list current directory to show changes
dir %new_folder_path%
echo.
echo Program finished at...%TIME%
echo.
pause
rem program end

看起来您正在运行findstr 199次。我希望通过删除for/l循环并使用单个findstr实例来提高速度 也许:


findstr/r“\这是避免调用
findstr
的另一个想法。虽然不是防弹的(仅针对torrent电影网站的前几页列表进行测试),但这可以在合理的时间内处理任务

其主要思想是从文件名中删除数字(在
for/f
循环中使用它们作为分隔符)并在另一个
中为/f
使用剩余字符作为分隔符,以便仅在文件名中保留数字。然后迭代该组数字以确定它们是否匹配所需的年份范围。如果找到年份,则脚本将回显以控制台执行
move
命令。如果输出正确,请删除
echo
执行
move
操作

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于(*.torrent)中的%%#do(
对于/f“令牌=1-26 delims=0123456789”%%a in(“%%~n#”)do(
设置“delims=%%a%%b%%c%%d%%e%%f%%g%%h%%i%%j%%k%%l%%m%%n%%o%%p%%q%%r%%s%%t%%u%%v%%w%%x%%y%%z”
电话:2008年&&(
延迟扩展
对于(“!年!”)中的%%y,请执行以下操作(
端部
如果不存在“%%~y\”md“%%~y”
回显移动“%%~#”“%%~y”
)
)
)
)
后藤:eof
:每年
对于%%a in(““”)do for/f”令牌=1-26 delims=%delims%%“%%%a in(“%%~n#”)do for%%in(
%%~z%%~y%%~x%%~w%%~v%%~u%%~t%%~s%%~r%%~q%%~p%%~o%%~n
%%~m%%~l%%~k%%~j%%~i%%~h%%~g%%~f%%~e%%~d%%~c%%~b%%~a
)如果%%~#geq 1900如果%%~#leq 2016(
设置“年=%%~#”
退出/b0
)
退出/b 1

简而言之,您必须在程序开始时(或至少在循环之前)编写
setlocal enabledelayedexpansion
并使用
!TIME!
而不是
%TIME%
打印当前值,而不是循环开始时的值。

对于循环中正确的时间值:
echo!TIME!
。对于性能,您的程序听起来不错,可能技术不好。Python可能更适合那些长的命令文件。谢谢对于@Jean Françoisfare,程序现在显示正确的时间。:)由于我没有时间学习另一种计算机编程语言的语法和语义,我将保留C#。您的文件名模板/模式是否总是
某个字符串YYYY.torrent
,或者是
某个字符串YYYY anystring.torrent
?到@JosefZ,YYYY(年)的职位文件名内部与此无关。重要的是,必须将其提取为字符串值,并用于创建名为folder_YYYY的新文件夹,以保存名称内部具有相同yyy字符串的文件。问题中描述的问题通过Jean-Francois Fabre ansver/comment得以解决。通过此,您可以查找存在的问题我知道@aschipfl,提供的代码示例与被允许工作的代码匹配;
findstr/r“\来自@Jean François Fabre的相同且正确的Answer。此解决方案非常出色!我已经用上面的代码创建了cmd.exe文件,并将其放置在文件夹中,其中包含准备移动的文件。执行后,程序完全执行了必要的操作。创建了按文件名中找到的年份命名的新文件夹,并将文件移动到其中。考虑到新文件夹的名称和路径,我必须在代码内部进行一些更改,并且必须从程序行echo move“%%~#”“%%y”中删除echo命令,这样程序才能完美运行。
findstr /r "\<19[0-9][0-9] \<20[0-9][0-9]"