返回列表 发帖
回复 14# buyiyang


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

TOP

本帖最后由 WHY 于 2024-2-2 11:30 编辑
@if(0)==(0) echo off
pushd "D:\Test"
for /f "tokens=1*delims=|" %%i in ('dir /b *_*.pdf ^| cscript -nologo -e:jscript "%~f0"')do (
    echo ren "%%i" "%%j"
)
pause & exit
@end
var max = 0, arr = [];
var reg = /_([0-9]+)(?=\....$)/;
while (!WSH.StdIn.AtEndOfStream) {
    var file = WSH.StdIn.ReadLine();
    var m = file.match(reg);
    if (!m) continue;
    if (max < m[1].length) max = m[1].length;
    arr.push(file);
}
var zero = new Array(max).join('0');
var reg1 = new RegExp('_[0-9]{' + max + '}(?=\....$)');
for (var i = 0; i < arr.length; i++) {
    if (arr[i].match(reg1)) continue;
    var newFile = arr[i].replace(
        reg,
        function(s0,s1){return '_' + (zero + s1).slice(-max)}
    )
    WSH.Echo(arr[i] + '|' + newFile);
}COPY

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 速度太慢,改用正则判断。
$srcPath = 'D:\Test\';
$max = 0;
$files = dir -Path $srcPath -Filter *_*.pdf;
for ($i = 30; $i -ge 1; $i--) {
    $reg = '_[0-9]{' + $i + '}$';
    if (($files.BaseName -match $reg).Count -gt 0) {$max = $i; break;}
}
$reg = '_[0-9]{1,' + ($max-1) + '}$';
$files | ?{$_.BaseName -match $reg} | ren -NewName {
    $arr = $_.BaseName.Split('_');
    $arr[-1] = $arr[-1].PadLeft($max, '0');
    ($arr -join '_') + $_.Extension;
} -whatIf
pauseCOPY

TOP

返回列表