CJK Strings on .bat文件

时间:2018-05-05 17:47:37

标签: batch-file replace cmd utf cjk

我最近发现这段代码替换了文件的某些部分,我希望自动化这个过程。

所以代码是这样的:

@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

::BatchSubstitude - parses a File line by line and replaces a substring"
::syntax: BatchSubstitude.bat OldStr NewStr File
::          OldStr [in] - string to be replaced
::          NewStr [in] - string to replace with
::          File   [in] - file to be parsed
::$changed 20100115
::$source https://www.dostips.com
chcp 65001

if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B"
    if defined line (
        call set "line=echo.%%line:%~1=%~2%%"
        for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
    ) ELSE echo.
)

我添加了chcp 65001以支持UTF8。

我使用start.bat文件调用BatchSubstitute.bat文件:

chcp 65001
set "nombreAPasar=いとうかなこ - ファティマ.m3u8"
BatchSubstitute.bat ".flac" .wav %nombreAPasar%

我想做什么,你可能已经猜到了将“.flac”转换成播放列表文件中的“.wav”字符串いとうかなこ - ファティマ.m3u8,文本为:

#EXTM3U
#EXTINF:246,いとうかなこ - ファティマ
01 - ファティマ - ファティマ.flac
#EXTINF:277,いとうかなこ - はじまりの歌
02 - ファティマ - はじまりの歌.flac
#EXTINF:303,いとうかなこ - 宿業ノ剣
03 - ファティマ - 宿業ノ剣.flac
#EXTINF:246,いとうかなこ - ファティマ(off vocal)
04 - ファティマ - ファティマ(off vocal).flac
#EXTINF:271,いとうかなこ - はじまりの歌(off vocal)
05 - ファティマ - はじまりの歌(off vocal).flac
#EXTINF:302,いとうかなこ - 宿業ノ剣(off vocal)
06 - ファティマ - 宿業ノ剣(off vocal).flac

它引发了我的错误:

D:(Path)>start.bat

D:(Path)>chcp 65001
Página de códigos activa: 65001

D:(Path)>set "nombreAPasar=いとうかなこ - ファティマ.m3u8"

D:(Path)>BatchSubstitute.bat ".flac" .wav いとうかなこ - ファティマ.m3u8
Página de códigos activa: 65001
El sistema no puede encontrar el archivo especificado.

这里唯一有意义的事情是最后一行,意思是:The system coulnd't find the specified file并且它被BatchSubstitute文件的in ('"type %3|find /n /v """') do部分抛出(我知道这是因为我执行了它而没有关闭@echo)

如果您想要完整输出:

D:(path)>start.bat

D:(path)>chcp 65001
Página de códigos activa: 65001

D:(path)>set "nombreAPasar=いとうかなこ - ファティマ.m3u8"

D:(path)>BatchSubstitute.bat ".flac" .wav いとうかなこ - ファティマ.m3u8

D:(path)>REM -- Prepare the Command Processor --

D:(path)>SETLOCAL ENABLEEXTENSIONS

D:(path)>SETLOCAL DISABLEDELAYEDEXPANSION

D:(path)>chcp 65001
Página de códigos activa: 65001

D:(path)>if ".flac" == "" findstr "^::" "D:\Users\Alonso\Desktop\RIPSteinsGate\FLAC\WAV\BatchSubstitute.bat"  & GOTO:EOF

D:(path)>for /F "tokens=1,* delims=]" %A in ('"type いとうかなこ|find /n /v """') do (
set "line=%B"
 if defined line (
call set "line=echo.%line:.flac=.wav%"
 for /F "delims=" %X in ('"echo."%line%""') do %~X
)  ELSE echo.
)
El sistema no puede encontrar el archivo especificado.

所以我尝试了多种方法将完整的字符串传递给脚本,但没有人为我工作。我认为有错误。

现实中的CMD确实显示了吗?它周围有一个正方形,但事情是它理解它,所以没有问题,(也粘贴的文本直接从CMD复制)。

是否有任何解决方案或其他脚本以同样的方式执行相同操作? 提前谢谢。

----------------------------------------------- ---------------------------------

更新: 我刚刚修改了我的.bat,看起来似乎是进步:

的start.bat

chcp 65001
set "nombreAPasar="いとうかなこ - ファティマ.m3u8""
BatchSubstitute.bat ".flac" .wav %nombreAPasar%

BatchSubstitute.bat

 (just put that :: to give you info)::@echo off
    REM -- Prepare the Command Processor --
    SETLOCAL ENABLEEXTENSIONS
    SETLOCAL DISABLEDELAYEDEXPANSION

    ::BatchSubstitude - parses a File line by line and replaces a substring"
    ::syntax: BatchSubstitude.bat OldStr NewStr File
    ::          OldStr [in] - string to be replaced
    ::          NewStr [in] - string to replace with
    ::          File   [in] - file to be parsed
    ::$changed 20100115
    ::$source https://www.dostips.com
    chcp 65001

    if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
    for /f "tokens=1,* delims=]" %%A in ('"type %~3|find /n /v """') do (
        set "line=%%B"
        if defined line (
            call set "line=echo.%%line:%~1=%~2%%"
            for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
        ) ELSE echo.
    )

返回的新错误是:

D:(path)>if ".flac" == "" findstr "^::" "(path)"  & GOTO:EOF

D:(path)>for /F "tokens=1,* delims=]" %A in ('"type いとうかなこ - ファティマ.m3u8|find /n /v """') do (
set "line=%B"
 if defined line (
call set "line=echo.%line:.flac=.wav%"
 for /F "delims=" %X in ('"echo."%line%""') do %~X
)  ELSE echo.
)
El sistema no puede encontrar el archivo especificado.
Error mientras se procesaba: いとうかなこ.
El sistema no puede encontrar el archivo especificado.
Error mientras se procesaba: -.
El sistema no puede encontrar el archivo especificado.
Error mientras se procesaba: ファティマ.m3u8.

注意:

El sistema no puede encontrar el archivo especificado. == System couldn't find specified file

Error mientras se procesaba: いとうかなこ. == Error while processing: ---

1 个答案:

答案 0 :(得分:0)

好的,终于做到了。 在这行BatchSubstitute .bat我改变了

for /f "tokens=1,* delims=]" %%A in ('"type %~3|find /n /v """') do ( 

通过

for /f "tokens=1,* delims=]" %%A in ('"type "%~3"|find /n /v """') do (

并删除了chcp 65001因为它被写入输出文件,仅在调用.bat而不是被调用的文件上被执行。

并且还将start.bat更改为:

chcp 65001 set "nameFile="いとうかなこ - ファティマ.m3u8""
call BatchSubstitute.bat ".flac" ".wav" %nameFile% > temp.temp
del %nameFile%
rename temp.temp %nameFile% 

如果你想让它发挥作用,我就把它留在这里。

https://drive.google.com/file/d/1jRVaI3UJEXLRKxzd_YNZEwGD3c-kL1z2/view?usp=sharing

另请注意,.bat文件以UTF-8编码,没有BOM。