[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 14# buyiyang


    这个可能跟 CMD 预处理机制本身有关。
  1. echo;a&echo;b
  2. pause
复制代码
保存为批处理,运行后可以看到预处理之后的样子:echo;a  & echo;b
echo;a后面为两个空格,多出了一个空格。CMD 它想这么解析,没办法。

TOP

本帖最后由 WHY 于 2024-2-2 11:30 编辑
  1. @if(0)==(0) echo off
  2. pushd "D:\Test"
  3. for /f "tokens=1*delims=|" %%i in ('dir /b *_*.pdf ^| cscript -nologo -e:jscript "%~f0"')do (
  4.     echo ren "%%i" "%%j"
  5. )
  6. pause & exit
  7. @end
  8. var max = 0, arr = [];
  9. var reg = /_([0-9]+)(?=\....$)/;
  10. while (!WSH.StdIn.AtEndOfStream) {
  11.     var file = WSH.StdIn.ReadLine();
  12.     var m = file.match(reg);
  13.     if (!m) continue;
  14.     if (max < m[1].length) max = m[1].length;
  15.     arr.push(file);
  16. }
  17. var zero = new Array(max).join('0');
  18. var reg1 = new RegExp('_[0-9]{' + max + '}(?=\....$)');
  19. for (var i = 0; i < arr.length; i++) {
  20.     if (arr[i].match(reg1)) continue;
  21.     var newFile = arr[i].replace(
  22.         reg,
  23.         function(s0,s1){return '_' + (zero + s1).slice(-max)}
  24.     )
  25.     WSH.Echo(arr[i] + '|' + newFile);
  26. }
复制代码

TOP

回复 17# buyiyang
多翻一翻老帖:
http://www.bathome.net/viewthread.php?tid=7629
示例:
(echo test)|findstr /c:" "
效果:显示test,findstr认为前面的命令输出含有空格
注释:CMD的预处理在分析语句时,会在)和|这些有特殊意义的转义字符前后插入空格,同时剪除多余的空格。
        而当)和|一同出现时,CMD的预处理没有把这些空格从命令行中全部过滤掉,而会遗漏一个空格到echo命令中。
        而echo命令则把这个空格连通之前文本一同输出到管道后命令findstr中,所以导致findstr匹配出含空格行。
链接:http://www.bathome.net/viewthrea ... amp;page=3#pid50356
        http://www.bathome.net/viewthrea ... amp;page=4#pid28166
1

评分人数

TOP

本帖最后由 WHY 于 2024-2-2 11:26 编辑

假设最大数字位数不超过30位,事实上,30位已经是天文数字。

用 Test-Path 速度太慢,改用正则判断。
  1. $srcPath = 'D:\Test\';
  2. $max = 0;
  3. $files = dir -Path $srcPath -Filter *_*.pdf;
  4. for ($i = 30; $i -ge 1; $i--) {
  5.     $reg = '_[0-9]{' + $i + '}$';
  6.     if (($files.BaseName -match $reg).Count -gt 0) {$max = $i; break;}
  7. }
  8. $reg = '_[0-9]{1,' + ($max-1) + '}$';
  9. $files | ?{$_.BaseName -match $reg} | ren -NewName {
  10.     $arr = $_.BaseName.Split('_');
  11.     $arr[-1] = $arr[-1].PadLeft($max, '0');
  12.     ($arr -join '_') + $_.Extension;
  13. } -whatIf
  14. pause
复制代码

TOP

返回列表