标题: [文本处理] 【已解决】批处理如何处理路径或文件名的空格以及在文本中指定字符串后面添加空格 [打印本页]
作者: 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”
三、我写的命令- @echo off
- color 17
- echo.
- echo 按任意键,生成“解开关卡答案命令 YASC.bat”并打开关卡目录,请运行它,对关卡答案解锁!
- pause>nul
- more /e +9 %0>>"%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\YASC.bat"
- explorer "%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\"
- goto:eof
-
- @echo off
- color 17
- echo.
- echo 正在对关卡答案解锁,并保存为TXT文本,请稍候 ...
- if exist "Crazy Monk.sok" ren "Crazy Monk.sok" Crazy_Monk.sok
- if exist "du Peloux.sok" ren "du Peloux.sok" du_Peloux.sok
- setlocal enabledelayedexpansion
- for %%a in ("*.sok")do (
- for /f "delims=" %%i in (%%a)do (
- set m=%%i
- if "!m:~0,8!" == "Solution" (echo !m:~0,8! !m:~8!)else echo !m!
- )>>%%~na.txt
- )
- ren Crazy_Monk.sok "Crazy Monk.sok"
- ren du_Peloux.sok "du Peloux.sok"
- ren Crazy_Monk.txt "Crazy Monk.txt"
- 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 升级时也可以用:- @echo off
-
- color 17
- echo.
- set F="%USERPROFILE%\Documents\Sokoban\Sokoban YASC\Levels\"
- if not exist ~temp md ~temp
- copy %F%*.sok ~temp\>nul
- echo 正在对关卡答案解锁,并保存为TXT文本,请稍候 ...
- if exist "~temp\Crazy Monk.sok" ren "~temp\Crazy Monk.sok" Crazy_Monk.sok
- if exist "~temp\du Peloux.sok" ren "~temp\du Peloux.sok" du_Peloux.sok
- setlocal enabledelayedexpansion
- for %%a in (~temp\*.sok)do (
- for /f "delims=" %%i in (%%a)do (
- set m=%%i
- if "!m:~0,8!" == "Solution" (echo !m:~0,8! !m:~8!)else echo !m!
- )>>%F%%%~na.txt
- )
- echo 解锁完毕,按任意键完成操作!
- pause>nul
- ren %F%Crazy_Monk.txt "Crazy Monk.txt"
- ren %F%du_Peloux.txt "du Peloux.txt"
- if not exist ~temp\*.txt rd /s /q ~temp
- goto:eof
复制代码
作者: pcl_test 时间: 2016-10-2 23:52
- rem win7以上系统运行。直接修改覆盖源文件
- powershell -c "$fd=[environment]::getfolderpath('mydocuments')+'\Sokoban\Sokoban YASC\Levels\';cd $fd;dir -filter *.sok|?{!$_.PSIsContainer}|%%{(gc $_) -replace '(?<=^\s*Solution)',' '|out-file $_ -encoding default}"
- 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 |