Board logo

标题: [文件操作] 批处理如何按指定规则给多个文件的文件名末尾添加指定位数的随机大写字母? [打印本页]

作者: crownking1983    时间: 2016-7-5 00:26     标题: 批处理如何按指定规则给多个文件的文件名末尾添加指定位数的随机大写字母?

本帖最后由 pcl_test 于 2016-7-5 13:30 编辑

难题!求批处理实现一万多个文件所有文件添加5位随机大写字母,且还要确保每7个文件中,要有且只有随机1个文件的末尾最后一个子母为DKRX四个字母其中的一个。

我这里有一个批处理命令,只是实现了所有文件添加5位随机大写字母。但是要控制确保每7个文件中,要有且只有随机1个文件的末尾最后一个子母为DKRX四个字母其中的一个,这个我不知道如何做,请大神指点。
http://www.bathome.net/redirect. ... 5635&ptid=34960

所谓确保每7个文件中,要有且只有随机1个文件的末尾最后一个子母为DKRX四个字母其中的一个的意思就是说,如下例——
文件批处理后成为        001JFHNE.txt  002HGSBT.txt 003LKEJQ.txt 004ZXSDE.txt 005RFVCD.txt 006WERTY.txt 007ASXCF.txt
                             008QWEDG.txt   009QWEDF.txt 010DEFGT.txt 011QWESL.txt 012ZXCDF.txt 013LRKMK.txt 014SDFGL.txt
                              ...  ...
005RFVCD.txt 就是001-007这七个文件中随机抽取的一个文件 末尾字母为D 其它六个文件末尾字母不能为DKRX四个中的任意一个
013LRKMK.txt 就是008-014这七个文件中随机抽取的一个文件 末尾字母为K 其它六个文件末尾字母不能为DKRX四个中的任意一个
就是这个意思了…… 很难吧……如果您一定要问为什么这个要求这么奇葩,我只能说是工作需要了……DKRX这四个字母有特别的含义,它是作为这一万多个文件中每七个文件抽取其中一个带上一个作为暗码的(嘿嘿,有点间谍特工的意思)
作者: WHY    时间: 2016-7-5 11:30

本帖最后由 WHY 于 2016-7-6 01:17 编辑

powershell 可以这样:
  1. $arr = dir *.txt | ?{$_ -is [IO.FileInfo]}  #### 遍历当前目录下的txt文件
  2. $num = 7                                    #### 每7个文件一组
  3. $chr = 'ABCEFGHIJLMNOPQSTUVWYZDKRX'.ToCharArray()
  4. $i = 0
  5. while ($arr[$i] -ne $null) {
  6.     $flag = 1
  7.     $arr[$i..($i + $num - 1)] | get-Random -Count $num | %{
  8.         $str = ($chr | get-Random -Count 26) -join(''); $str *= 2;
  9.         if ($flag) {
  10.             $flag = 0
  11.             $str = [regex]::match($str, '....[DKRX]').value
  12.         } else {
  13.             $str = [regex]::match($str, '....[^DKRX]').value
  14.         }
  15.         $newName = $_.Name -replace '(.+)(\..+)$', ('$1' + $str + '$2')
  16.         ren $_ -newName $newName
  17.     }
  18.     $i += $num
  19. }
复制代码
  1. @if (0)==(0) echo off
  2. dir /b *.txt | cscript //nologo //e:jscript "%~0"
  3. pause & exit
  4. @end
  5. var num = 7;  //每7个文件一组
  6. var chr = 'ABCEFGHIJLMNOPQSTUVWYZDKRX'.match(/./g);
  7. var fso = new ActiveXObject('Scripting.FileSystemObject');
  8. var arr = WSH.StdIn.ReadAll().replace(/\r\n$/, '').split('\r\n');
  9. while(arr.length > 0){
  10.     var m = arr.slice(0, num);
  11.     m.sort(function(){return Math.random() - 0.5});
  12.     for (var i=0; i<m.length; i++) {
  13.         var s  = chr.sort(function(){return Math.random() - 0.5}).join(''); s += s;
  14.         if (i==0) {
  15.             s = s.match(/....[DKRX]/);
  16.         } else {
  17.             s = s.match(/....[^DKRX]/);
  18.         }
  19.         fso.GetFile(m[i]).Name = m[i].replace(/(.+)(\..+)$/, '$1' + s + '$2');
  20.     }
  21.     arr.splice(0, num);
  22. }
复制代码

作者: pcl_test    时间: 2016-7-5 21:38

本帖最后由 pcl_test 于 2016-7-5 22:27 编辑
  1. //&cls&(dir /a-d/b *.txt|findstr /v "[A-Z][A-Z][A-Z][A-Z][A-Z]\.txt$")|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var i=0, s='', n=7;
  3. var str1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
  4. var str2 = 'DKRX'.split('');
  5. var reg = new RegExp(str2.join('|'));
  6. var fso = new ActiveXObject('Scripting.Filesystemobject');
  7. while(!WSH.StdIn.AtEndOfStream){
  8.     if(i==0||i==n){var i=0;var t = Math.floor(Math.random()*n);s+='此组第'+(t+1)+'个为特殊命名\r\n'}
  9.     var file = fso.GetFile(WSH.StdIn.ReadLine());
  10.     var t1 = str1.sort(function(){return Math.random()-.5});
  11.     while(reg.test(t1[4])){var t1 = str1.sort(function(){return Math.random()-.5});}
  12.     var t2 = str2[Math.floor(Math.random()*str2.length)];
  13.     if(i==t){
  14.         s+=(file.name = fso.GetBaseName(file)+t1.join('').substr(0, 4)+t2+'.'+fso.GetExtensionName(file))+'\r\n';
  15.     }else{
  16.         s+=(file.name = fso.GetBaseName(file)+t1.join('').substr(0, 5)+'.'+fso.GetExtensionName(file))+'\r\n';
  17.     }
  18.     i++;  
  19. }
  20. fso.OpenTextFile('处理结果.txt', 2, true).Write(s);
  21. WSH.echo('Done');
复制代码





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