Board logo

标题: [文本处理] 【已解决】批处理如何处理路径或文件名的空格以及在文本中指定字符串后面添加空格 [打印本页]

作者: pan528    时间: 2016-10-1 09:04     标题: 【已解决】批处理如何处理路径或文件名的空格以及在文本中指定字符串后面添加空格

本帖最后由 pan528 于 2016-10-3 07:54 编辑

如何解决DOS下的空格问题
一、问题

最近我在玩一款推箱子游戏。Sokoban YASC,https://sourceforge.net/projects/sokobanyasc/

Sokoban YASC 自带了许多关卡,其实都附上了答案。但为了增加玩家的解关动力,作者屏蔽了答案。经分析,作者只是将关卡标识后的空格删除了,或者说在标识后加上空格就答案就“解锁”了。

我想写一个批命令,让它自动解锁。

二、材料

关卡文件的位置在“%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\”。

关卡文本的名称中有二个是带空格的。

关卡的标识字符是“Solution”

三、我写的命令
  1. @echo off
  2. color 17
  3. echo.
  4. echo 按任意键,生成“解开关卡答案命令 YASC.bat”并打开关卡目录,请运行它,对关卡答案解锁!
  5. pause>nul
  6. more /e +9 %0>>"%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\YASC.bat"
  7. explorer "%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\"
  8. goto:eof
  9. @echo off
  10. color 17
  11. echo.
  12. echo 正在对关卡答案解锁,并保存为TXT文本,请稍候 ...
  13. if exist "Crazy Monk.sok" ren "Crazy Monk.sok" Crazy_Monk.sok
  14. if exist "du Peloux.sok" ren "du Peloux.sok" du_Peloux.sok
  15. setlocal enabledelayedexpansion
  16. for %%a in ("*.sok")do (
  17. for /f "delims=" %%i in (%%a)do (
  18. set m=%%i
  19. if "!m:~0,8!" == "Solution" (echo !m:~0,8! !m:~8!)else echo !m!
  20. )>>%%~na.txt
  21. )
  22. ren Crazy_Monk.sok "Crazy Monk.sok"
  23. ren du_Peloux.sok "du Peloux.sok"
  24. ren Crazy_Monk.txt "Crazy Monk.txt"
  25. ren du_Peloux.txt "du Peloux.txt"
复制代码
这个命令显然不能一步完成。
主要是因为不知道在上述循环命令中怎样解决空格问题,试过用引号的方式,但会出错,结果命令写成上述样子。

四、求助

上述三个方面涉及到空格:文本名中有空格;路经中有空格;解关文本中要在标识后加入空格。

如何一步完成批处理,请高手指点。
作者: happy886rr    时间: 2016-10-1 10:24

回复 1# pan528
直接在记事本里,点击替换,把所有Solution替换为Solution+空格,即可游戏。
作者: codegay    时间: 2016-10-1 10:40

回复 2# happy886rr


    他大概是想做成给别人用的工具。
作者: happy886rr    时间: 2016-10-1 11:04

回复 3# codegay
不过他提供了关卡的解,我正好集成到我的推箱子里。
作者: codegay    时间: 2016-10-1 11:15

回复 4# happy886rr


    好鸡智~
作者: pcl_test    时间: 2016-10-1 12:55

资深潜水的结果是还分不清dos和cmd
作者: pan528    时间: 2016-10-2 23:07

下面的笨办法也可一步完成,要求不高的推箱爱好者可以收藏,下次 Sokoban YASC 升级时也可以用:
  1. @echo off
  2. color 17
  3. echo.
  4. set F="%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\"
  5. if not exist ~temp md ~temp
  6. copy %F%*.sok ~temp\>nul
  7. echo 正在对关卡答案解锁,并保存为TXT文本,请稍候 ...
  8. if exist "~temp\Crazy Monk.sok" ren "~temp\Crazy Monk.sok" Crazy_Monk.sok
  9. if exist "~temp\du Peloux.sok" ren "~temp\du Peloux.sok" du_Peloux.sok
  10. setlocal enabledelayedexpansion
  11. for %%a in (~temp\*.sok)do (
  12. for /f "delims=" %%i in (%%a)do (
  13. set m=%%i
  14. if "!m:~0,8!" == "Solution" (echo !m:~0,8! !m:~8!)else echo !m!
  15. )>>%F%%%~na.txt
  16. )
  17. echo 解锁完毕,按任意键完成操作!
  18. pause>nul
  19. ren %F%Crazy_Monk.txt "Crazy Monk.txt"
  20. ren %F%du_Peloux.txt "du Peloux.txt"
  21. if not exist ~temp\*.txt rd /s /q ~temp
  22. goto:eof
复制代码

作者: pcl_test    时间: 2016-10-2 23:52

  1. rem win7以上系统运行。直接修改覆盖源文件
  2. powershell -c "$fd=[environment]::getfolderpath('mydocuments')+'\Sokoban\Sokoban YASC\Levels\';cd $fd;dir -filter *.sok|?{!$_.PSIsContainer}|%%{(gc $_) -replace '(?<=^\s*Solution)',' '|out-file $_ -encoding default}"
  3. pause
复制代码

作者: pan528    时间: 2016-10-3 07:31

回复 8# pcl_test


谢谢赐教!

powershell 太强大了,代码简洁,有空要学一学。
作者: pan528    时间: 2016-10-3 07:50

回复 8# pcl_test

版主,有没有入门教程可推荐?谢谢!
作者: Batcher    时间: 2016-10-3 19:09

回复 10# pan528


看看这几个教程是否中意
http://bbs.bathome.net/thread-26220-1-1.html
作者: pan528    时间: 2016-10-3 19:36

谢谢版主!待我慢慢消化。




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