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

[文本处理] 【已解决】求助批处理如何在输出文件名的时候,将特定的英文单引号字符替换掉呢?

[复制链接]
发表于 2022-12-5 10:57:16 | 显示全部楼层 |阅读模式
本帖最后由 kimycai 于 2022-12-5 19:17 编辑
  1. for %%a in (*.flac) do ffmpeg -y -i "%%a" -acodec pcm_s24le  -ar 48000  "%%~na.wav"
复制代码
此代码是将flac文件转换成wav,并以同文件名输出,
那如何在输出文件名时,将原有文件名中的英文单引号(')替换成中文字符的单引号(’)并输出呢?
PS:只要遇到文件名中有英文单引号,一律替换并输出
发表于 2022-12-5 11:00:45 | 显示全部楼层
英文双引号在文件名中是非法的吧!你可以试着手工把双引号添加到文件名中测试一下。
 楼主| 发表于 2022-12-5 11:03:01 | 显示全部楼层
回复 2# qixiaobin0715


    是吗,那我检查下文件名是不是英文字符
 楼主| 发表于 2022-12-5 11:04:23 | 显示全部楼层
英文双引号在文件名中是非法的吧!你可以试着手工把双引号添加到文件名中测试一下。
qixiaobin0715 发表于 2022-12-5 11:00



    对对,应该只是单引号要替换,我修改下内容
发表于 2022-12-5 11:35:23 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.flac) do (
  4.     set "out=%%~na"
  5.     set "out=!out:'=‘!"
  6.     ffmpeg -y -i "%%a" -acodec pcm_s24le  -ar 48000  "!out!.wav"
  7. )
复制代码

中文的引号不是分左右的吗?
发表于 2022-12-5 12:16:39 | 显示全部楼层
回复 1# kimycai


中文的单引号、双引号是区分左右的。
建议考虑把英文引号直接删掉,而不是替换。
发表于 2022-12-5 12:25:22 | 显示全部楼层
如果不影响大局的话,不要纠结了,英文中文又何妨?
 楼主| 发表于 2022-12-5 14:51:55 | 显示全部楼层
中文的引号不是分左右的吗?
77七 发表于 2022-12-5 11:35



    需要加上CHCP 65001,可以用了,谢谢
 楼主| 发表于 2022-12-5 14:53:17 | 显示全部楼层
回复 6# Batcher


    单引号在歌曲名里,比如英文歌曲名是需要的,所以还是要稍微保留一下,只要显示在右上方就可以了
 楼主| 发表于 2022-12-5 14:54:06 | 显示全部楼层
回复 7# qixiaobin0715


    英文的引号在传递参数时会引起命令行出错,所以必须要替换掉
 楼主| 发表于 2022-12-5 15:52:20 | 显示全部楼层
回复 5# 77七


    set "out=!out:'=‘!"
请问这句是什么意思,包括第一个out和第二个out?
发表于 2022-12-5 15:57:57 | 显示全部楼层
本帖最后由 tmplinshi 于 2022-12-5 16:21 编辑
  1. @echo off

  2. for %%a in (*.flac) do (
  3.     call :ReplaceSingleQuotes "%%~na" newNameNoExt
  4.     set "oldName=%%a"
  5.     setLocal enableDelayedExpansion

  6.     ffmpeg -y -i "!oldName!" -acodec pcm_s24le  -ar 48000  "!newNameNoExt!.wav"

  7.     endLocal
  8. )

  9. pause
  10. exit /b


  11. :ReplaceSingleQuotes <inputStr> <outputVar>

  12.     setLocal disableDelayedExpansion

  13.     set "inputStr=%~1"
  14.     set "inputStr=%inputStr:^^=^%"
  15.     set "outputVar=%~2"
  16.     set "outputStr="

  17.     if "%inputStr:'=%" == "%inputStr%" (
  18.         endLocal & set "%outputVar%=%inputStr%" & exit /b
  19.     )

  20.     set isLeftQuote=true
  21.     set leftQuote=‘
  22.     set rightQuote=’

  23.     setLocal enableDelayedExpansion

  24.     for /l %%i in (0 1 1000) do (
  25.         set c=!inputStr:~%%i,1!

  26.         if "!c!" == "" (goto :ReplaceSingleQuotes_Finish)

  27.         if "!c!" == "'" (
  28.             if !isLeftQuote! == true (
  29.                 set c=%leftQuote%
  30.                 set isLeftQuote=false
  31.             ) else (
  32.                 set c=%rightQuote%
  33.                 set isLeftQuote=true
  34.             )
  35.         )

  36.         set "outputStr=!outputStr!!c!"
  37.     )

  38.     :ReplaceSingleQuotes_Finish
  39.     endLocal & endLocal & set "%outputVar%=%outputStr%"
  40.     exit /b
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 拜读大作,获益匪浅。

查看全部评分

发表于 2022-12-5 17:10:52 | 显示全部楼层
本帖最后由 77七 于 2022-12-5 17:11 编辑

回复 11# kimycai


      
  1.     @echo off
  2.     setlocal enabledelayedexpansion
  3.     for %%a in (*.flac) do (
  4.         set "out1=%%~na"
  5.         set "out2=!out1:'=‘!"
  6.         ffmpeg -y -i "%%a" -acodec pcm_s24le  -ar 48000  "!out2!.wav"
  7.     )
复制代码

这样估计好理解了..“=”前后是被替换和替换后的内容
发表于 2022-12-5 18:38:59 | 显示全部楼层
回复 12# tmplinshi


  1. set "inputStr=%inputStr:^^=^%"
  2. if "!c!" == "" (goto :ReplaceSingleQuotes_Finish)
复制代码

请教版主一个问题,这个第一行的代码是什么意思?
我以为和第二行这个有关,但是我把第一行删了,结果也是正确的
 楼主| 发表于 2022-12-5 19:06:46 | 显示全部楼层
回复 12# tmplinshi


    这段暂时还不理解,得好好学习,感谢版主大大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 03:11 , Processed in 0.024027 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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