标题: [文本处理] 【已解决】求助批处理如何在输出文件名的时候,将特定的英文单引号字符替换掉呢? [打印本页]
作者: kimycai 时间: 2022-12-5 10:57 标题: 【已解决】求助批处理如何在输出文件名的时候,将特定的英文单引号字符替换掉呢?
本帖最后由 kimycai 于 2022-12-5 19:17 编辑
- 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
- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.flac) do (
- set "out=%%~na"
- set "out=!out:'=‘!"
- ffmpeg -y -i "%%a" -acodec pcm_s24le -ar 48000 "!out!.wav"
- )
复制代码
中文的引号不是分左右的吗?
作者: 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 编辑
- @echo off
-
- for %%a in (*.flac) do (
- call :ReplaceSingleQuotes "%%~na" newNameNoExt
- set "oldName=%%a"
- setLocal enableDelayedExpansion
-
- ffmpeg -y -i "!oldName!" -acodec pcm_s24le -ar 48000 "!newNameNoExt!.wav"
-
- endLocal
- )
-
- pause
- exit /b
-
-
- :ReplaceSingleQuotes <inputStr> <outputVar>
-
- setLocal disableDelayedExpansion
-
- set "inputStr=%~1"
- set "inputStr=%inputStr:^^=^%"
- set "outputVar=%~2"
- set "outputStr="
-
- if "%inputStr:'=%" == "%inputStr%" (
- endLocal & set "%outputVar%=%inputStr%" & exit /b
- )
-
- set isLeftQuote=true
- set leftQuote=‘
- set rightQuote=’
-
- setLocal enableDelayedExpansion
-
- for /l %%i in (0 1 1000) do (
- set c=!inputStr:~%%i,1!
-
- if "!c!" == "" (goto :ReplaceSingleQuotes_Finish)
-
- if "!c!" == "'" (
- if !isLeftQuote! == true (
- set c=%leftQuote%
- set isLeftQuote=false
- ) else (
- set c=%rightQuote%
- set isLeftQuote=true
- )
- )
-
- set "outputStr=!outputStr!!c!"
- )
-
- :ReplaceSingleQuotes_Finish
- endLocal & endLocal & set "%outputVar%=%outputStr%"
- exit /b
复制代码
作者: 77七 时间: 2022-12-5 17:10
本帖最后由 77七 于 2022-12-5 17:11 编辑
回复 11# kimycai
- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*.flac) do (
- set "out1=%%~na"
- set "out2=!out1:'=‘!"
- ffmpeg -y -i "%%a" -acodec pcm_s24le -ar 48000 "!out2!.wav"
- )
复制代码
这样估计好理解了..“=”前后是被替换和替换后的内容
作者: 77七 时间: 2022-12-5 18:38
回复 12# tmplinshi
- set "inputStr=%inputStr:^^=^%"
- 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七
是为了兼容文件名中含有^字符的情况。
比如以下代码显示的结果是 "^^_^^",而不是期望的 "^_^"。- @echo off
-
- set str="^_^"
- call :sub %str%
- pause
- exit /b
-
- :sub
- 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 编辑
- @echo off
- setlocal disabledelayedexpansion
-
- for %%a in (*.flac) do (
- set "in=%%~na"
- setlocal enabledelayedexpansion
- set "out=!in:'=‘!"
- ffmpeg -y -i "!in!.flac" -acodec pcm_s24le -ar 48000 "!out!.wav"
- endlocal
- )
复制代码
作者: 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###
- @echo off
- setlocal enabledelayedexpansion
- set "a=Adele - !Hello.flac"
- set "b=Adele - !Hello!.flac"
- echo !a!
- echo !b!
- pause
- endlocal
-
-
- @echo off
- set "a=Adele - !Hello.flac"
- set "b=Adele - !Hello!.flac"
- echo %a%
- echo %b%
- 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 |