[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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:只要遇到文件名中有英文单引号,一律替换并输出

英文双引号在文件名中是非法的吧!你可以试着手工把双引号添加到文件名中测试一下。

TOP

回复 2# qixiaobin0715


    是吗,那我检查下文件名是不是英文字符

TOP

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



    对对,应该只是单引号要替换,我修改下内容

TOP

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

中文的引号不是分左右的吗?
bat小白,请多指教!谢谢!

TOP

回复 1# kimycai


中文的单引号、双引号是区分左右的。
建议考虑把英文引号直接删掉,而不是替换。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

如果不影响大局的话,不要纠结了,英文中文又何妨?

TOP

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



    需要加上CHCP 65001,可以用了,谢谢

TOP

回复 6# Batcher


    单引号在歌曲名里,比如英文歌曲名是需要的,所以还是要稍微保留一下,只要显示在右上方就可以了

TOP

回复 7# qixiaobin0715


    英文的引号在传递参数时会引起命令行出错,所以必须要替换掉

TOP

回复 5# 77七


    set "out=!out:'=‘!"
请问这句是什么意思,包括第一个out和第二个out?

TOP

本帖最后由 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

评分人数

    • 77七: 拜读大作,获益匪浅。技术 + 1

TOP

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

这样估计好理解了..“=”前后是被替换和替换后的内容
bat小白,请多指教!谢谢!

TOP

回复 12# tmplinshi


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

请教版主一个问题,这个第一行的代码是什么意思?
我以为和第二行这个有关,但是我把第一行删了,结果也是正确的
bat小白,请多指教!谢谢!

TOP

回复 12# tmplinshi


    这段暂时还不理解,得好好学习,感谢版主大大

TOP

返回列表