[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
顶楼脚本删除的是回车换行符、行前行后的空格字符、以及 .webp .png .jpg 字符
那么,“在删除字符前加个过滤”指的是删除哪个字符前增加过滤?

TOP

假设先删除回车换行符、行前行后的空白字符,然后增加过滤条件,再删除 .webp .png .jpg
  1. @echo off
  2. PowerShell "$str=[IO.File]::ReadAllText('a.xml',[Text.Encoding]::Default) -replace '(?m)^\s+|\s*(?:\n|$)' -replace '<!--(?:(?!-->).)*-->'; $str=[regex]::Replace($str, '<(?!Time\s|ImageNumber\s)[^<>]*>', {param($m);$s=$m.Value;if(($s -split '\ssrc=|\ssrcid=').Count -gt 2){$s}else{$s -replace '\.(png|jpg|webp)'}}); [IO.File]::WriteAllText('b.xml', $str, [Text.Encoding]::UTF8)"
  3. pause
复制代码
1

评分人数

    • smss: 没错就是这样技术 + 1

TOP

本帖最后由 WHY 于 2019-6-14 19:40 编辑

回复 4# smss


    单引号对 包含单引号时,用两个单引号,相当于单引号转义。
-replace '\.(png''?|jpg|webp)'  删除 .png' 或者 .png 或 .jpg 或 .webp

[IO.File]::ReadAllText('a.xml', [Text.Encoding]::default) -replace '(?<!<\S+)\s+'   删除所有空白字符,包括回车换行符,但保留每个节点后的空格。

TOP

回复 6# smss


1.这些问题与本主题无关,你不会开新帖?
2.我没有时间、也没有义务回答你所有问题;
3.我看不懂你在说什么,不明白你想干什么。

TOP

本帖最后由 WHY 于 2019-6-17 15:14 编辑
  1. $file1 = '1.xml';   #修改前的 xml 文件
  2. $file2 = '2.xml';   #修改后的 xml 文件
  3. $path  = 'E:\Test'; #存放图片的文件夹
  4. $str = [IO.File]::ReadAllText($file1, [Text.Encoding]::Default);
  5. $str = $str -replace '(?<!<[^<>\s]+)\s+' -replace '<!--(?:(?!-->).)*-->';
  6. $arr = $str -split '(?<=<[^<>]*>)'; #以元素节点为单元分割数组
  7. [Collections.ArrayList]$List = @();
  8. for ( $i=0; $i -lt $arr.Count; $i++ ){
  9.     $m = $arr[$i] -cmatch '<Time\s|<ImageNumber\s|\bsrc=.*\bsrcid=|\bsrcid=.*\bsrc='; #增加过滤条件
  10.     if ($m) {
  11.         forEach ( $a In [regex]::Matches($arr[$i], '(?<=["/])[^"/]+(?=\.(?i:png|jpg|webp))') ){
  12.             $key = $a.Value.ToLower() + '_*';
  13.             if ( !$List.Contains($key) ){
  14.                 [void]$List.Add($key);
  15.             }
  16.         }
  17.     } else {
  18.         $arr[$i] = $arr[$i] -replace '\.(?:png|jpg|webp)';
  19.     }
  20. }
  21. [IO.File]::WriteAllText($file2, $arr -join '', [Text.Encoding]::UTF8);
  22. dir $path -Include *.png, *.jpg, *.webp -Exclude $List -Recurse | ren -NewName{$_.BaseName}
  23. echo 'Done';
  24. [Console]::ReadKey();
复制代码

TOP

回复 10# smss


    src="time.png" 这个 time 前面没有斜杠字符
第 14 行:
  1. forEach ( $a In [regex]::Matches($arr[$i], '(?<=["/])[^"/]+(?=\.(?i:png|jpg|webp))') ){
复制代码
1

评分人数

    • smss: 牛 可以啦技术 + 1

TOP

回复 12# smss


    Test.ps1 的前三行这样改:
  1. param([string]$path);
  2. $file1 = '1.xml';  #修改前的 xml 文件
  3. $file2 = '2.xml';  #修改后的 xml 文件
复制代码
Test.bat 这样写:
  1. @echo off
  2. cd /d "%~dp0"
  3. PowerShell -exec ByPass "&'%~dp0Test.ps1'" "%~f1"
  4. pause
复制代码
但强烈不建议拖拽,你如果遇到路径中包含特殊字符,肯定会头疼得厉害

> 字符后增加换行:
[IO.File]::ReadAllText... -Replace '>', ">`r`n"
1

评分人数

TOP

回复 14# smss


    哦,不含属性的元素节点没有考虑到,
-replace '(?<!<\S+)\s' 改成 -replace '(?<!<[^<>\s]+)\s+'
#9已修改

TOP

返回列表