Board logo

标题: 50求助 perl代码功能用批处理实现 不胜感激 [打印本页]

作者: 41348934    时间: 2017-3-19 19:11     标题: 50求助 perl代码功能用批处理实现 不胜感激

  1. $seekdir = "d:\\ftptemp\\iocm-tmp";                       
  2. $tagtdir = "d:\\ftptemp\\iocm-acl";                       
  3. $backdir = "d:\\ftptemp\\iocm-rcv";                       
  4. use File::Copy;                                          
  5. chdir( "$seekdir" );                                      
  6. opendir(FROMDIR, "." );                           
  7. @msgfiles = grep(/^[0-z]/,readdir(FROMDIR));              ## 将读取的(/^[0-z]/没理解匹配的是什么)文件赋值数组@msgfiles
  8. closedir(FROMDIR);                                       
  9. if($msgfiles[0]) {                                       
  10. $tstr = time();                                           ## 从1970年1月1日起累计的秒数赋值给$tstr
  11. @fnames = @msgfiles;                                      ## 将@msgfiles中的文件赋值给@fnames  
  12. for ($idx = 0; $fnames[$idx]; $idx++) {                  
  13. $aa = "$tstr$idx";                                        ## 将秒数与当前数据的下标结合的字符串赋值给$aa
  14. open(IN,"$seekdir\\$fnames[$idx]");                       ## 打开$fnames[$idx]当前操作的文件
  15. @file = <IN>;                                             ## 将文件内容赋值给数组@file
  16. $str = "+ACL";                                            ## 将字符串'+ACL'赋值给$str
  17. close IN;                                                
  18. $rep_count = 0;                                           ## $rep_count为计数
  19. foreach $file(@file) {                                    ## 遍历数组@file
  20. $find = index ($file, $str);                              ## 寻找字符串'+ACL'
  21.                                                          
  22. if ($find >= 0) {                                          
  23. $rep_count = $rep_count+1;                                
  24. } else {
  25. }
  26. }
  27. if ($rep_count > 0) {                                             
  28. rename( "$seekdir\\$fnames[$idx]" , "$tagtdir\\e$aa.acl.txt" );## 字符串存在的文件移动到$tagtdir 并改名字e$aa.acl 格式为txt
  29. } else {
  30.                                           
  31. rename( "$seekdir\\$fnames[$idx]" , "$backdir\\e$aa.rcv.txt" );## 字符串不存在的文件移动到$backdir 并改名字e$aa.acl 格式为txt
  32. }
  33. }
  34. }
  35.                                                            
  36. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); ## 日期函数
  37. my $date = sprintf "%.4d%.2d%.2d", $year+1900, $mon+1, $mday;               ## 控制日期格式(20170319)
  38. print $date."\n";                                                           ## 打印出当前日期
  39. if (!-d "./$date"){                                                         ## 如果当前目录下不存在$date命名的文件夹
  40. mkdir "./$date";                                                            ## 创建$date文件夹
  41. }
  42. else{
  43. print "Directory already exists!\n";                                       
  44. }
复制代码
时间越快越好
作者: pcl_test    时间: 2017-3-19 20:08

本帖最后由 pcl_test 于 2017-3-19 23:37 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set "seekdir=d:\ftptemp\iocm-tmp"                     
  3. set "tagtdir=d:\ftptemp\iocm-acl"                     
  4. set "backdir=d:\ftptemp\iocm-rcv"
  5. rem 获取10位时间戳
  6. for /f %%a in ('mshta "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Date.parse(new Date()).toString().substr(0,10));close();"') do set tstr=%%a
  7. rem 初始化数字序号
  8. set n=0
  9. rem 遍历seekdir目录里的文件
  10. for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"') do (
  11.     rem 时间戳和数字序号相拼接
  12.     set aa=%tstr%!n!
  13.     rem 查找文件中是否存在指定字符串,使用&&和||进行逻辑判断,copy是复制重命名,move是移动重命名
  14.     findstr "+ACL" "%seekdir%\%%a">nul&&(
  15.         rem 存在指定字符串
  16.         copy "%seekdir%\%%a" "%tagtdir%\e!aa!.acl.txt"
  17.     )||(
  18.         rem 不存在指定字符串
  19.         copy "%seekdir%\%%a" "%backdir%\e!aa!.acl.txt"
  20.     )
  21.     rem 数字序号自增一
  22.     set /a n+=1
  23. )
  24. rem 获取标准日期
  25. for /f "tokens=2 delims==" %%a in ('wmic path win32_operatingsystem get LocalDateTime /value ^| findstr "="') do set "strDate=%%a"
  26. rem 截取格式化日期
  27. set today=%strDate:~0,4%%strDate:~4,2%%strDate:~6,2%
  28. rem 判断指定路径当前日期的文件夹是否存在
  29. set "指定路径=D:\test"
  30. if exist "%指定路径%\%today%\" (echo;Directory already exists!) else md "%指定路径%\%today%\"
  31. pause
复制代码

作者: 41348934    时间: 2017-3-19 20:58

回复 2# pcl_test
太谢谢您了版主 您留个方式 我把报酬给您

另外我还有几个不明白的地方

/^[0-z]/ 到底是什么意思  我之前测这段代码的时候 @开头的文件也匹配上了  而您写的没有匹配

rename()这个函数有移动文件的功能么  也是测试的时候发现 操作的文件不仅改了名字 还移动到了其他文件夹  而您写的并不是移动 是复制

当前日期的文件夹可以指定一个路径么  而不是bat文件所在的路径   应该在哪里加上

另外可以把每段写上注释么 因为还有一些其他类似这种代码  我不知道应该从哪里取舍

这个找不到指定路径是怎么回事
作者: pcl_test    时间: 2017-3-19 21:48

回复 3# 41348934

[0-z]不知你是要匹配什么,如果是匹配开头是数字字母的文件,应该是/^[0-9a-z]/i
已加注释
作者: 41348934    时间: 2017-3-19 21:49

回复 2# pcl_test

能说说那个正则表达式的意义么
作者: 41348934    时间: 2017-3-19 21:59

回复 4# pcl_test

move \\jpjaccs2\EDIMBKsnd\send\*.* d:\ntt2\1\   如果我想移动数字字母开头的文件  通配那里要怎么写啊
作者: pcl_test    时间: 2017-3-19 22:02

回复 6# 41348934
for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[0-9a-z]"') do (
作者: 41348934    时间: 2017-3-19 22:16

谢谢你啦版主
作者: 41348934    时间: 2017-3-20 11:31

回复 7# pcl_test
for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[Ee]"') do (
move "%seekdir%\%%a" "%tagtdir%\%%a"
)

版主我想将移动后的文件首字母改成大写   "%tagtdir%\%%a" 该怎么写啊
作者: pcl_test    时间: 2017-3-20 12:06

回复 9# 41348934
  1. for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^e"') do (
  2.     set "name=%%~na"&set "首字母=!name:~,1!"
  3.     for %%i in (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) do (
  4.         set "首字母=!首字母:%%i=%%i!"
  5.     )
  6.     move "%seekdir%\%%a" "%tagtdir%\!首字母!!name:~1!%%~xa"
  7. )
复制代码

作者: 41348934    时间: 2017-3-20 14:19

回复 10# pcl_test


    感谢感谢
作者: 41348934    时间: 2017-3-21 09:51

回复 10# pcl_test
  1. for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[Ee]"') do (
  2.     set "name=%%~na"&set "e=!name:~,1!"
  3.     for %%i in (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) do (
  4.     set "e=!e:%%i=%%i!"
  5.     )
  6.     ren  "%seekdir%\%%a" "%seekdir%\!e!!name:~1!%%~xa"
  7.     copy "%seekdir%\!e!!name:~1!%%~xa"" "%backdira%\!e!!name:~1!%%~xa"
  8.     move "%backdira%\!e!!name:~1!%%~xa" "%tagtdir%\EDIBkgMITSUI!aa!.snd"
  9.     move "%tagtdir%\EDIBkgMITSUI!aa!.snd" "%backdir%\EDIBkgMITSUI!aa!.snd"
  10. )
复制代码
操作的文件夹里有E或e开头的
我想先将e换成E后
将所有E开头的文件一起操作 移动 复制等其他功能
但是现在源文件夹里的e没有改变啊....
是哪里不对么
作者: pcl_test    时间: 2017-3-21 10:36

测试没有问题,首行有setlocal enabledelayedexpansion吗?另外你的findstr /i "^[Ee]"是不分大小写,只要e开头是findstr  "^e"
另外如果只是替换一个字母,可以这样
  1. for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr "^e"') do (
  2.     set "name=%%a"
  3.     set "name=E!name:~1!"
  4.     echo;%%a --^> !name!
  5.     ren  "%seekdir%\%%a" "%seekdir%\!name!"
  6. )
复制代码

作者: 41348934    时间: 2017-3-21 12:51

回复 13# pcl_test
谢谢版主 我是把路径写错了
  1. @echo off&setlocal enabledelayedexpansion
  2. set "seekdir=D:\ntt2\1"                     
  3. set "tagtdir=D:\ntt2\2"                     
  4. set "backdir=D:\ntt2\3"
  5. set "backdira=D:\ntt2\back"
  6. for /f %%a in ('mshta "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Date.parse(new Date()).toString().substr(0,10));close();"') do set tstr=%%a
  7. set n=0
  8. for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[Ff]"') do (
  9.     set "name=%%~na"&set "f=!name:~,1!"
  10.     for %%i in (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) do (
  11.     set "f=!f:%%i=%%i!"
  12.     )
  13. set aa=%tstr%!n!
  14.     copy "%seekdir%\%%a" "%backdira%\!f!!name:~1!%%~xa"
  15.     move "%seekdir%\!f!!name:~1!%%~xa" "%tagtdir%\FI_!aa!.snd"
  16.    echo open ftp.ms.us.gxs.com>>D:\NTT2\ntt.shl  
  17.    echo MTSUISCOSU01S>>D:\NTT2\ntt.shl
  18.    echo IXdKo9MF>>D:\NTT2\ntt.shl
  19.    echo bin>>D:\NTT2\ntt.shl
  20.    echo put %tagtdir%\FI_!aa!.snd>>D:\NTT2\ntt.shl
  21.    echo close>>D:\NTT2\ntt.shl
  22.    echo quit>>D:\NTT2\ntt.shl
  23.    
  24.    call D:\NTT2\ntt2.bat>>D:\NTT2\ntt.log
  25.   
  26.    move "%tagtdir%\FI_!aa!.snd" "%backdir%\FI_!aa!.snd"
  27.    set /a n+=1
  28. )
复制代码
日志文件那里出了点问题

.shl里的文件名是序列的 怎么到日志里却是一样的了

麻烦您啦




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2