标题: [文本处理] [已解决]批处理命令for语句中引用为何出错? [打印本页]
作者: keiamy 时间: 2012-1-15 10:48 标题: [已解决]批处理命令for语句中引用为何出错?
本帖最后由 keiamy 于 2012-1-16 09:56 编辑
这是youxi01大大在cn-dos里曾经帮人解答过的的一段代码 (原贴:http://www.cn-dos.net/forum/view ... 0810&sid=ziqZC9)- @echo off
- setlocal enabledelayedexpansion
-
- if "%2"=="" (
- for /f "tokens=2 delims=#" %%i in ('"%~0" %~s1 OK^|sort') do echo %%i
- ) else (
- for /f %%i in (%1) do (
- call :CheckNum %%i Res
- echo !Res!#%%i)
- goto :eof)
-
- pause>nul
-
- :CheckNum num Res
- set/a Res=0
- for /l %%i in (0 1 1000) do (
- set "var=%~1"
- set tmp=!var:~%%i,1!
- if "!tmp!"=="" goto :eof
- set/a Res+=1)
复制代码
测试文本:复制代码
为何将第一个for 中的%~s1与第二个for 的%1互换后会出错(在%1路径带有空格的情况下拖进P内)
因本人还是很菜鸟,想了很久也不明所以,所以才发贴求助,高手们可以给我解释下吗?谢谢的
作者: CrLf 时间: 2012-1-15 12:00
这代码有点不严谨
首先,文件名含空格是无法用%~s1解决的,因为 %~s1 的意思是“扩展的路径只含有短名”,它只针对路径,与文件名没有关系。所以应把 in ('"%~0" %~s1 OK^|sort') do 中的 %~s1 改为 %1
其次,for /f %%i in (%1) do 这一句没有考虑到当 %1 被双引号括起来时将被理解为是字符串。所以应该使用 for /f useback %%i in ("%~1") do
另外,代码核心思路上也有问题,没有考虑到当 !Res! 超过 9 时将出现错误的排序,比如 1234567890 大于 20(10 位的数字排在 2 位数字之前)
其实类似的题目,一般都是用补位排序解决的,简单有效
作者: ivor 时间: 2012-1-15 12:45
本帖最后由 ivor 于 2012-1-15 12:52 编辑
回复 2# CrLf
for中的useback测试没问题发生 但是标准应该是 usebackq吧
作者: CrLf 时间: 2012-1-15 12:57
回复 3# ivor
嗯
作者: keiamy 时间: 2012-1-15 14:43
首先很是多謝CrLf 版主和ivor 的詳細解答和測試,其實%~s1是我自己加上的,youxi01的原貼是%1的(哈哈,不好意思) youxi01在原貼中也說明了使用格式:命令行中,输入:[本文件名] [待处理数字文本文件名],若依他的格式是并沒問題,但我想把測試文本拖進P時就會報錯 'C:\Documents' 不是內部或外部命令(是路徑含空格問題是吧﹖)
若測試文本是=C:\Documents and Settings\Administrator\桌面\test.txt
和暫不考慮測試文本名含空格,test.txt內容都在九位數以內
為何%~s1用在第一個for 可以,但用在第二個卻不能呀???(其實我最想知道是這个)
首次發貼,所以表達不好了,哈哈!
在這真的很有學習風氣,剛發貼不久,版主就回應了,謝謝大家!
作者: keiamy 时间: 2012-1-15 15:47
另外為何錯誤結果是這样的, 'C:\Documents' 不是內部或外部命令.可執行的程式式或批次檔...
若第一個和第二個for裡都是%1的話,不是這样嗎:
for /f %%i in ("C:\Documents and Settings\Administrator\桌面\test.txt"
) do (
call :CheckNum %%i Res
echo !Res!#%%i)
goto :eof)
因雙引號參數被for當作字符串處理後, C:\Documents 不是應該會繼續轉跳到:CheckNum進行嗎﹖
作者: CrLf 时间: 2012-1-15 17:37
回复 6# keiamy
我想我知道原因了,错误应该源于 "%~0" %~s1 OK,这里用 "%~0" 也是一个不严谨之处,in (' ') do 中的内容是传递给 cmd /c 执行的,for 再对这个 cmd 的输出进行解析,但是 cmd /c 有个特性,当其参数以 " 打头时,将会脱引号。
比如 cmd /c "aasd cxv" 123 这句会被解释成 cmd /c aasd cxv" 123,所以会出错。
解决方案有很多,只要不让双引号打头就行了,比如可以把 "%~0" 写成 @%0,或者 ;%0,再或者 %~sdp0"%~nx0"
作者: keiamy 时间: 2012-1-16 09:54
十分感謝版主的熱心解答,原來是這样的,
因為自己還是很菜,靠自己還是無法解理,就得靠版主的幫助,現弄明白了,版主很高深呀
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |