Board logo

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

作者: kimycai    时间: 2022-12-5 10:57     标题: 【已解决】求助批处理如何在输出文件名的时候,将特定的英文单引号字符替换掉呢?

本帖最后由 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:只要遇到文件名中有英文单引号,一律替换并输出
作者: qixiaobin0715    时间: 2022-12-5 11:00

英文双引号在文件名中是非法的吧!你可以试着手工把双引号添加到文件名中测试一下。
作者: kimycai    时间: 2022-12-5 11:03

回复 2# qixiaobin0715


    是吗,那我检查下文件名是不是英文字符
作者: kimycai    时间: 2022-12-5 11:04

英文双引号在文件名中是非法的吧!你可以试着手工把双引号添加到文件名中测试一下。
qixiaobin0715 发表于 2022-12-5 11:00



    对对,应该只是单引号要替换,我修改下内容
作者: 77七    时间: 2022-12-5 11:35

  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. )
复制代码

中文的引号不是分左右的吗?
作者: Batcher    时间: 2022-12-5 12:16

回复 1# kimycai


中文的单引号、双引号是区分左右的。
建议考虑把英文引号直接删掉,而不是替换。
作者: qixiaobin0715    时间: 2022-12-5 12:25

如果不影响大局的话,不要纠结了,英文中文又何妨?
作者: kimycai    时间: 2022-12-5 14:51

中文的引号不是分左右的吗?
77七 发表于 2022-12-5 11:35



    需要加上CHCP 65001,可以用了,谢谢
作者: kimycai    时间: 2022-12-5 14:53

回复 6# Batcher


    单引号在歌曲名里,比如英文歌曲名是需要的,所以还是要稍微保留一下,只要显示在右上方就可以了
作者: kimycai    时间: 2022-12-5 14:54

回复 7# qixiaobin0715


    英文的引号在传递参数时会引起命令行出错,所以必须要替换掉
作者: kimycai    时间: 2022-12-5 15:52

回复 5# 77七


    set "out=!out:'=‘!"
请问这句是什么意思,包括第一个out和第二个out?
作者: tmplinshi    时间: 2022-12-5 15: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
复制代码

作者: 77七    时间: 2022-12-5 17:10

本帖最后由 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.     )
复制代码

这样估计好理解了..“=”前后是被替换和替换后的内容
作者: 77七    时间: 2022-12-5 18:38

回复 12# tmplinshi


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

请教版主一个问题,这个第一行的代码是什么意思?
我以为和第二行这个有关,但是我把第一行删了,结果也是正确的
作者: kimycai    时间: 2022-12-5 19:06

回复 12# tmplinshi


    这段暂时还不理解,得好好学习,感谢版主大大
作者: kimycai    时间: 2022-12-5 19:08

回复  kimycai


        
这样估计好理解了..“=”前后是被替换和替换后的内容
77七 发表于 2022-12-5 17:10



    就是把 !out1:'=‘! 再赋值给out2的意思吗
作者: 77七    时间: 2022-12-5 19:28

回复 16# kimycai


   对
作者: Batcher    时间: 2022-12-5 19:34

回复 11# kimycai


字符串替换,参考set命令教程第9页
http://bbs.bathome.net/thread-31727-1-1.html


作者: kimycai    时间: 2022-12-5 19:46

本帖最后由 kimycai 于 2022-12-5 19:50 编辑

回复 18# Batcher


    多谢admin指路!
作者: tmplinshi    时间: 2022-12-5 19:56

回复 14# 77七


是为了兼容文件名中含有^字符的情况。
比如以下代码显示的结果是 "^^_^^",而不是期望的 "^_^"。
  1. @echo off
  2. set str="^_^"
  3. call :sub %str%
  4. pause
  5. exit /b
  6. :sub
  7.     echo %1
复制代码

作者: 77七    时间: 2022-12-5 20:14

回复 20# tmplinshi


   原来^字符在call语句中会多出来一个,谢谢版主!
作者: kimycai    时间: 2022-12-8 00:11

中文的引号不是分左右的吗?
77七 发表于 2022-12-5 11:35



    但是,在遇到文件名中有英文感叹号时,这条命令就会被忽略跳过,该怎么修改呢?
作者: tmplinshi    时间: 2022-12-8 00:45

本帖最后由 tmplinshi 于 2022-12-8 00:46 编辑
  1. @echo off
  2. setlocal disabledelayedexpansion
  3. for %%a in (*.flac) do (
  4.     set "in=%%~na"
  5.     setlocal enabledelayedexpansion
  6.     set "out=!in:'=‘!"
  7.     ffmpeg -y -i "!in!.flac" -acodec pcm_s24le  -ar 48000  "!out!.wav"
  8.     endlocal
  9. )
复制代码

作者: 77七    时间: 2022-12-8 03:06

本帖最后由 77七 于 2022-12-8 03:21 编辑

回复 22# kimycai


   我还是第一次遇到这样的情况,看了版主的回答,在站内搜了下,原来文件名中的感叹号会被当作表示延迟变量的符号,被省略了...

http://www.bathome.net/thread-4872-1-1.html     8楼总结

https://www.cn-dos.net/forum/viewthread.php?tid=30884###

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "a=Adele - !Hello.flac"
  4. set "b=Adele - !Hello!.flac"
  5. echo !a!
  6. echo !b!
  7. pause
  8. endlocal
  9. @echo off
  10. set "a=Adele - !Hello.flac"
  11. set "b=Adele - !Hello!.flac"
  12. echo %a%
  13. echo %b%
  14. pause
复制代码

作者: 77七    时间: 2022-12-8 03:11

这也让我想起了,有次我看到一个版主的教学帖子,延迟变量要在for语句里面写开始和结束
作者: kimycai    时间: 2022-12-8 08:32

本帖最后由 kimycai 于 2022-12-8 09:02 编辑
tmplinshi 发表于 2022-12-8 00:45



    转换不了,提示“09 - Asuka Strikes.flac: No such file or directory”,且flac文件没有被转换掉,原本的文件名是“09 - Asuka Strikes!.flac”
作者: kimycai    时间: 2022-12-8 08:43

本帖最后由 kimycai 于 2022-12-8 09:02 编辑

回复 25# 77七


    转换不了,提示“09 - Asuka Strikes.flac: No such file or directory”,且flac文件没有被转换掉,原本的文件名是“09 - Asuka Strikes!.flac”,该如何修改呢
作者: kimycai    时间: 2022-12-8 08:51

回复 25# 77七


    如果引用时不用感叹号,是不是可以用其他方法来代替感叹号的引用呢,这样问题是不是能解决?
作者: kimycai    时间: 2022-12-8 08:58

回复 25# 77七


    是不是不保留感叹号会更好处理,但是感觉替换不掉感叹号
作者: kimycai    时间: 2022-12-8 09:34

回复 26# kimycai


    是我贴错代码了,开头没有disable
作者: kimycai    时间: 2022-12-8 09:34

回复 25# 77七


    已经可以了,是我自己改错了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2