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

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

本帖最后由 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"
复制代码
这个命令显然不能一步完成。
主要是因为不知道在上述循环命令中怎样解决空格问题,试过用引号的方式,但会出错,结果命令写成上述样子。

四、求助

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

如何一步完成批处理,请高手指点。
2

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
    • pcl_test: 发帖前先使用论坛搜索PB -4

回复 1# pan528
直接在记事本里,点击替换,把所有Solution替换为Solution+空格,即可游戏。

TOP

回复 2# happy886rr


    他大概是想做成给别人用的工具。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 3# codegay
不过他提供了关卡的解,我正好集成到我的推箱子里。

TOP

回复 4# happy886rr


    好鸡智~
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

资深潜水的结果是还分不清dos和cmd

TOP

下面的笨办法也可一步完成,要求不高的推箱爱好者可以收藏,下次 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
复制代码

TOP

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

评分人数

TOP

回复 8# pcl_test


谢谢赐教!

powershell 太强大了,代码简洁,有空要学一学。

TOP

回复 8# pcl_test

版主,有没有入门教程可推荐?谢谢!

TOP

回复 10# pan528


看看这几个教程是否中意
http://bbs.bathome.net/thread-26220-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

返回列表