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

[文件操作] 纯批处理能否对包含“多国语言字符”的文件路径操作?

本帖最后由 yu2n 于 2013-4-18 19:42 编辑

文件夹同步操作:

call :del_difference 操作出现错误:
    简体系统下,简体中文路径正常操作。
    繁体系统下,简体中文路径无法操作,提示找不到路径。

call :xcopy_sh 操作则没有问题

完整代码如下:
  1. cls & @echo off & color 1f
  2. title Lol Sync [2013-04-16]
  3. :: sync folder
  4.     if /i "L@ALICIA-PC" equ "%username%@%computername%" (
  5.         call :xcopy_sh "\\yu2n-pc\d\game\LOLBox2" "D:\Game\LOLBox2"
  6.         call :xcopy_sh "\\yu2n-pc\d\game\英雄联盟" "D:\Game\英雄联盟"
  7.     )
  8.     call :done
  9.     goto :eof
  10. :: done tips
  11. :done
  12.     echo.
  13.     echo.
  14.     echo  ^> Sync is done!
  15.     echo.
  16.     color 2a
  17.     pause
  18.     goto :eof
  19. :: xcopy sh
  20. :xcopy_sh
  21.     set "path_src=%~1"
  22.     set "path_des=%~2"
  23.     dir /ad /b "%path_src%" >nul 2>nul || goto :eof
  24.     dir /ad /b "%path_des%" >nul 2>nul || goto :eof
  25.     echo  +  %path_src%
  26.     echo  -^> %path_des%
  27.     xcopy "%path_src%" "%path_des%" /D /E /V /C /I /H /R /Y
  28.     cls
  29.     echo delete difference folder ^& file
  30.     call :del_difference "%path_src%" "%path_des%"
  31.     echo.
  32.     goto :eof
  33.    
  34.    
  35. :: delete difference folder & file
  36. :del_difference
  37.     set "path_src=%~1"
  38.     set "path_des=%~2"
  39.     dir /ad /b "%path_src%" >nul 2>nul || goto :eof
  40.     dir /ad /b "%path_des%" >nul 2>nul || goto :eof
  41.     setlocal enableDelayedExpansion
  42.     for /f "delims=" %%i in ('dir /ad /b /s "%path_des%"') do (
  43.         set "path_sub=%%~i"
  44.         set "path_cut=!path_sub:%path_des%=!"
  45.         set "path_tmp=%path_src%!path_cut!"
  46.         if not exist "!path_tmp!" (
  47.             echo,%%i
  48.             echo,!path_tmp!
  49.             rd /q /s "%%~i"
  50.         )
  51.     )
  52.     for /f "delims=" %%i in ('dir /a-d /b /s "%path_des%"') do (
  53.         set "path_sub=%%~i"
  54.         set "path_cut=!path_sub:%path_des%=!"
  55.         set "path_tmp=%path_src%!path_cut!"
  56.         if not exist "!path_tmp!" (
  57.             echo,%%i
  58.             echo,!path_tmp!
  59.             del /q /s /f "%%~i"
  60.         )
  61.     )
  62.     endlocal
  63.     goto :eof
复制代码
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

chcp 936

TOP

本帖最后由 yu2n 于 2013-4-18 21:06 编辑

回复 2# Demon


    Demon,请问有自适应的方法吗,在不确定字符编码的情况下:
   
    比如,有一个目录,其中有若干文件,文件(文件夹)名含日文、韩文、简体中文……
    如何让程序自己决定对应的 chcp 码呢?

    还是,使用VBS来完成这种需求。
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

你的批处理是什么编码就chcp什么代码页

TOP

回复 4# Demon


    谢谢解答,我明天上班用繁体XP试试。
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

本帖最后由 yu2n 于 2013-4-19 08:35 编辑

回复 4# Demon


繁體XP無法指定 CHCP 936,錯誤提示如下:
  1. 無效字碼頁
复制代码
繁體XP執行BAT中簡體中文路徑錯誤提示依舊,如下:
  1. \\ntfile\doc$\Setup\tool\patch\2000 ?失 hal.dll 无法启动(安装其他启动
  2. 工具?件后)\disk_C
  3. \\ntf\div$\setup\tool\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后
  4. )\disk_C
  5. 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。
复制代码
設置 CHCP 936,設置失敗,能執行後續代碼,執行后仍提示“檔案名稱、目錄名稱或磁碟區標籤語法錯誤”。
設置 CHCP 850、CHCP 950,設置成功,執行后仍提示“檔案名稱、目錄名稱或磁碟區標籤語法錯誤”。
設置 CHCP 65001,設置成功,但不能執行後續代碼。
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

  1. @echo off
  2. chcp 950
  3. echo 英雄联盟
  4. pause
复制代码

TOP

回复 7# Demon

繁體XP 32 直接執行CMD命令
  1. dir /a /b /s D:\patch
复制代码
結果如下:
  1. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)
  2. D:\patch\Microsoft_DotNetFXCHS2.0.exe
  3. D:\patch\Reg MSMAPI32.OCX
  4. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C
  5. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\ReadMe.txt
  6. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\boot.ini
  7. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\bootfont.bin
  8. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\maxldr.mbr
  9. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\mxldr
  10. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\NTDETECT.COM
  11. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\ntldr
  12. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\winnt
  13. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\winnt\system3
  14. 2
  15. D:\patch\2000 遗失 hal.dll 无法启动(安装其他启动工具软件后)\disk_C\winnt\system3
  16. 2\hal.dll
  17. D:\patch\Reg MSMAPI32.OCX\MSMAPI32.OCX
  18. D:\patch\Reg MSMAPI32.OCX\psexec.exe
  19. D:\patch\Reg MSMAPI32.OCX\Reg MSMAPI32.OCX.bat
  20. D:\patch\Reg MSMAPI32.OCX\Reg MSMAPI32.OCX.log
复制代码
執行 test.bat
  1. @echo off
  2. chcp 950
  3. FOR /F "delims=" %%i in ('dir /a /b /s "D:\patch"') do (
  4.     echo,%%i
  5.     if not exist "%%~i" (echo,Miss)
  6. )
  7. pause
复制代码
結果如下:
  1. 使用中字碼頁: 950
  2. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)
  3. D:\patch\Microsoft_DotNetFXCHS2.0.exe
  4. D:\patch\Reg MSMAPI32.OCX
  5. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C
  6. Miss
  7. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\ReadMe.txt
  8. Miss
  9. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\boot.ini
  10. Miss
  11. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\bootfont.bin
  12. Miss
  13. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\maxldr.mbr
  14. Miss
  15. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\mxldr
  16. Miss
  17. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\NTDETECT.COM
  18. Miss
  19. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\ntldr
  20. Miss
  21. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\winnt
  22. Miss
  23. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\winnt\system32
  24. Miss
  25. D:\patch\2000 ?失 hal.dll 无法启动(安装其他启动工具?件后)\disk_C\winnt\system32\
  26. hal.dll
  27. Miss
  28. D:\patch\Reg MSMAPI32.OCX\MSMAPI32.OCX
  29. D:\patch\Reg MSMAPI32.OCX\psexec.exe
  30. D:\patch\Reg MSMAPI32.OCX\Reg MSMAPI32.OCX.bat
  31. D:\patch\Reg MSMAPI32.OCX\Reg MSMAPI32.OCX.log
  32. 請按任意鍵繼續 . . .
复制代码
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

试试将路径保存在一个 unicode 文本中,格式为:
  1. 路径1=c:\路径
  2. 路径2=c:\测试
  3. ....
复制代码
然后在 bat 用这个办法读取:
  1. @echo off
  2. for /f "delims=" %%a in ('type 路径列表.txt') do set "%%a"
  3. echo "%路径1%"
  4. echo "%路径2%"
  5. pause
复制代码
因为你的繁体环境用的可能不是 gb2312,用 gb2312 保存的文本可能会被错误解析,所以让 type 命令来将通用的 unicode 转为繁体编码也许能够搞定。只是猜测,权且试试呗。

TOP

回复 6# yu2n


   
設置 CHCP 65001,設置成功,但不能執行後續代碼。

如果能设置 65001 的话,可以直接将含有路径的 bat 保存为 utf-8 格式,然后在脚本头部 chcp 65001,见:http://bbs.bathome.net/viewthread.php?tid=12824

TOP

回复  Demon

繁體XP 32 直接執行CMD命令結果如下:執行 test.bat結果如下:
yu2n 发表于 2013-4-19 15:05


不要用for /f
  1. @echo off
  2. for /r D:\patch %%i in (*.*) do (
  3.     echo,%%i
  4.     if not exist "%%~i" (echo,Miss)
  5. )
  6. pause
复制代码

TOP

回复  yu2n


   
如果能设置 65001 的话,可以直接将含有路径的 bat 保存为 utf-8 格式,然后在脚本 ...
CrLf 发表于 2013-4-19 18:15


我记得以前跟你说过,XP的CMD有BUG,不能chcp 65001

TOP

回复 12# Demon


    不是 bug,只是 xp 不自带。但是楼主在 6 楼说繁体环境下切换到 65001 成功,所以想来是可以用的

TOP

回复  Demon


    不是 bug,只是 xp 不自带。但是楼主在 6 楼说繁体环境下切换到 65001 成功,所以想 ...
CrLf 发表于 2013-4-20 00:17


你不妨试试

TOP

回复 14# Demon


    我勒个去还真是,早先以为是不自带,原来是和 37 一样变态。

TOP

返回列表