找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 10213|回复: 9

[其他] [已解决]批处理bat删除歌曲名前的"数字"与"标点符号"

[复制链接]
发表于 2025-1-6 13:21:00 | 显示全部楼层 |阅读模式
本帖最后由 skpkmon 于 2025-1-7 13:51 编辑

请问各位大师,如何利用bat批次资料夹内的歌曲去除"数字"与"标点符号"?

01 - 断肠梦.dff --->断肠梦.dff
01.青春梦里人.wav --->青春梦里人.wav


评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2025-1-6 15:20:16 | 显示全部楼层
# 设置要遍历的目录
$directory = ".\music"  # 替换为你的文件夹路径

# 获取所有文件
Get-ChildItem -Path $directory -File | ForEach-Object {
    $originalName = $_.BaseName
    $extension = $_.Extension

    # 使用正则表达式去除数字和标点符号
    $newName = $originalName -replace '[0-9]', '' -replace '[^\w\s]', '' -replace '^\s+|\s+$', ''  # 去除数字和标点,去除首尾空格

    # 如果新文件名与原文件名不同,则重命名文件
    if ($newName -ne $originalName) {
        Rename-Item -Path $_.FullName -NewName "$newName$extension"
        Write-Host "重命名 '$originalName' 为 '$newName$extension'"
    }
}
发表于 2025-1-6 16:11:20 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-6 18:18 编辑

回复 1# skpkmon

以下代码存为 test.bat 运行,但不要存于歌曲文件所在目录下,代码中假定歌曲名内不再有前缀所包含的"数字"与"标点符号",假定歌曲文件所在目录(须为全路径)为 d:\music 可由楼主自定义,其中变量 _c 定义须删除的"数字"与"标点符号",可由楼主因需增减

  1. @echo off &cd /d "d:\music" &setlocal &set "_c=0123456789-_. "
  2. for %%F in (*) do for /f "delims=%_c%" %%a in ("%%~nF") do if /i "%%a" neq "%%~nF" ren "%%F" "%%a%%~xF"
  3. pause &exit/b
复制代码
若歌曲名内有前缀所包含的"数字"与"标点符号",须改用以下版本,其中变量 _c 定义须删除的"数字"与"标点符号",可由楼主因需增减

  1. @echo off &cd /d "d:\music" &setlocal &set "_c=0123456789-_. "
  2. for %%F in (*) do (
  3.    set "_a=%%~nF" &setlocal enabledelayedexpansion &(call :cut#H)
  4.    if /i "%%~nF" neq "!_a!" ren "%%F" "!_a!%%~xF" &endlocal)
  5. pause &exit/b
  6. :cut#H
  7.    if "!_a!"=="" (exit/b) else set "c=!_a:~,1!"
  8.    if "!_c:%c%=!"=="!_c!" (exit/b) else set "_a=!_a:~1!" &goto :cut#H
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2025-1-6 19:22:46 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. set "pre=1234567890.- "

  4. for /f "delims=" %%i in ('dir /b /a-d') do (
  5.     for /f "tokens=* delims=%pre%" %%f in ("%%~nxi") do (
  6.         ren "%%i" "%%f"
  7.         )
  8.     )
  9. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2025-1-6 20:11:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-6 20:13 编辑


4楼的 “tokens=* delims=...” 效果不错(实为一条删除字符串前缀的捷径!),但逻辑上有些 ‘怪异’,为何是删除前缀而非后缀呢?
发表于 2025-1-6 22:19:59 | 显示全部楼层
回复 5# aloha20200628


    因为for在处理字符串时会首先跳过开头的所有分隔符:
  1. while (*s2 && _tcschr(delims, *s2))
  2.                 s2 += 1;
复制代码
 楼主| 发表于 2025-1-7 13:50:38 | 显示全部楼层
谢谢各位高手帮忙、谢谢
发表于 2025-1-7 13:53:14 | 显示全部楼层
回复 2# new_user


这个也是批处理的代码吗?看着不太像啊。

好像说是 批处理无法使用 正则 呀
发表于 2025-1-7 18:11:57 | 显示全部楼层
回复 8# y123


    powershell
发表于 2025-1-7 21:18:20 | 显示全部楼层
回复 9# new_user


    原来是高阶呀,我这是刚接触批处理,谢谢解惑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:30 , Processed in 0.021949 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表