标题: 50求助 perl代码功能用批处理实现 不胜感激 [打印本页]
作者: 41348934 时间: 2017-3-19 19:11 标题: 50求助 perl代码功能用批处理实现 不胜感激
- $seekdir = "d:\\ftptemp\\iocm-tmp";
- $tagtdir = "d:\\ftptemp\\iocm-acl";
- $backdir = "d:\\ftptemp\\iocm-rcv";
-
- use File::Copy;
-
- chdir( "$seekdir" );
- opendir(FROMDIR, "." );
- @msgfiles = grep(/^[0-z]/,readdir(FROMDIR)); ## 将读取的(/^[0-z]/没理解匹配的是什么)文件赋值数组@msgfiles
- closedir(FROMDIR);
-
- if($msgfiles[0]) {
-
- $tstr = time(); ## 从1970年1月1日起累计的秒数赋值给$tstr
-
- @fnames = @msgfiles; ## 将@msgfiles中的文件赋值给@fnames
-
- for ($idx = 0; $fnames[$idx]; $idx++) {
- $aa = "$tstr$idx"; ## 将秒数与当前数据的下标结合的字符串赋值给$aa
-
- open(IN,"$seekdir\\$fnames[$idx]"); ## 打开$fnames[$idx]当前操作的文件
- @file = <IN>; ## 将文件内容赋值给数组@file
- $str = "+ACL"; ## 将字符串'+ACL'赋值给$str
- close IN;
- $rep_count = 0; ## $rep_count为计数
-
- foreach $file(@file) { ## 遍历数组@file
- $find = index ($file, $str); ## 寻找字符串'+ACL'
-
- if ($find >= 0) {
- $rep_count = $rep_count+1;
- } else {
- }
- }
- if ($rep_count > 0) {
-
- rename( "$seekdir\\$fnames[$idx]" , "$tagtdir\\e$aa.acl.txt" );## 字符串存在的文件移动到$tagtdir 并改名字e$aa.acl 格式为txt
-
- } else {
-
- rename( "$seekdir\\$fnames[$idx]" , "$backdir\\e$aa.rcv.txt" );## 字符串不存在的文件移动到$backdir 并改名字e$aa.acl 格式为txt
- }
- }
- }
-
-
- my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); ## 日期函数
- my $date = sprintf "%.4d%.2d%.2d", $year+1900, $mon+1, $mday; ## 控制日期格式(20170319)
- print $date."\n"; ## 打印出当前日期
- if (!-d "./$date"){ ## 如果当前目录下不存在$date命名的文件夹
- mkdir "./$date"; ## 创建$date文件夹
- }
- else{
- print "Directory already exists!\n";
- }
复制代码
时间越快越好
作者: pcl_test 时间: 2017-3-19 20:08
本帖最后由 pcl_test 于 2017-3-19 23:37 编辑
- @echo off&setlocal enabledelayedexpansion
- set "seekdir=d:\ftptemp\iocm-tmp"
- set "tagtdir=d:\ftptemp\iocm-acl"
- set "backdir=d:\ftptemp\iocm-rcv"
-
- rem 获取10位时间戳
- 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
-
- rem 初始化数字序号
- set n=0
- rem 遍历seekdir目录里的文件
- for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"') do (
- rem 时间戳和数字序号相拼接
- set aa=%tstr%!n!
- rem 查找文件中是否存在指定字符串,使用&&和||进行逻辑判断,copy是复制重命名,move是移动重命名
- findstr "+ACL" "%seekdir%\%%a">nul&&(
- rem 存在指定字符串
- copy "%seekdir%\%%a" "%tagtdir%\e!aa!.acl.txt"
- )||(
- rem 不存在指定字符串
- copy "%seekdir%\%%a" "%backdir%\e!aa!.acl.txt"
- )
- rem 数字序号自增一
- set /a n+=1
- )
-
- rem 获取标准日期
- for /f "tokens=2 delims==" %%a in ('wmic path win32_operatingsystem get LocalDateTime /value ^| findstr "="') do set "strDate=%%a"
-
- rem 截取格式化日期
- set today=%strDate:~0,4%%strDate:~4,2%%strDate:~6,2%
- rem 判断指定路径当前日期的文件夹是否存在
- set "指定路径=D:\test"
- if exist "%指定路径%\%today%\" (echo;Directory already exists!) else md "%指定路径%\%today%\"
- 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 - for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^e"') do (
- set "name=%%~na"&set "首字母=!name:~,1!"
- 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 (
- set "首字母=!首字母:%%i=%%i!"
- )
- move "%seekdir%\%%a" "%tagtdir%\!首字母!!name:~1!%%~xa"
- )
复制代码
作者: 41348934 时间: 2017-3-20 14:19
回复 10# pcl_test
感谢感谢
作者: 41348934 时间: 2017-3-21 09:51
回复 10# pcl_test - for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[Ee]"') do (
-
- set "name=%%~na"&set "e=!name:~,1!"
- 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 (
- set "e=!e:%%i=%%i!"
- )
-
- ren "%seekdir%\%%a" "%seekdir%\!e!!name:~1!%%~xa"
- copy "%seekdir%\!e!!name:~1!%%~xa"" "%backdira%\!e!!name:~1!%%~xa"
- move "%backdira%\!e!!name:~1!%%~xa" "%tagtdir%\EDIBkgMITSUI!aa!.snd"
- move "%tagtdir%\EDIBkgMITSUI!aa!.snd" "%backdir%\EDIBkgMITSUI!aa!.snd"
-
- )
复制代码
操作的文件夹里有E或e开头的
我想先将e换成E后
将所有E开头的文件一起操作 移动 复制等其他功能
但是现在源文件夹里的e没有改变啊....
是哪里不对么
作者: pcl_test 时间: 2017-3-21 10:36
测试没有问题,首行有setlocal enabledelayedexpansion吗?另外你的findstr /i "^[Ee]"是不分大小写,只要e开头是findstr "^e"
另外如果只是替换一个字母,可以这样- for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr "^e"') do (
- set "name=%%a"
- set "name=E!name:~1!"
- echo;%%a --^> !name!
- ren "%seekdir%\%%a" "%seekdir%\!name!"
- )
复制代码
作者: 41348934 时间: 2017-3-21 12:51
回复 13# pcl_test
谢谢版主 我是把路径写错了- @echo off&setlocal enabledelayedexpansion
- set "seekdir=D:\ntt2\1"
- set "tagtdir=D:\ntt2\2"
- set "backdir=D:\ntt2\3"
- set "backdira=D:\ntt2\back"
-
- 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
-
- set n=0
-
-
- for /f "delims=" %%a in ('dir /a-d /b "%seekdir%\"^|findstr /i "^[Ff]"') do (
-
- set "name=%%~na"&set "f=!name:~,1!"
- 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 (
- set "f=!f:%%i=%%i!"
- )
- set aa=%tstr%!n!
-
- copy "%seekdir%\%%a" "%backdira%\!f!!name:~1!%%~xa"
- move "%seekdir%\!f!!name:~1!%%~xa" "%tagtdir%\FI_!aa!.snd"
-
- echo open ftp.ms.us.gxs.com>>D:\NTT2\ntt.shl
- echo MTSUISCOSU01S>>D:\NTT2\ntt.shl
- echo IXdKo9MF>>D:\NTT2\ntt.shl
- echo bin>>D:\NTT2\ntt.shl
- echo put %tagtdir%\FI_!aa!.snd>>D:\NTT2\ntt.shl
- echo close>>D:\NTT2\ntt.shl
- echo quit>>D:\NTT2\ntt.shl
-
- call D:\NTT2\ntt2.bat>>D:\NTT2\ntt.log
-
- move "%tagtdir%\FI_!aa!.snd" "%backdir%\FI_!aa!.snd"
-
- set /a n+=1
-
- )
复制代码
日志文件那里出了点问题
.shl里的文件名是序列的 怎么到日志里却是一样的了
麻烦您啦
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |