中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 20:56
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战3] 取得最终有效目录[ 难度:☆]
楼 主 [挑战3] 取得最终有效目录[ 难度:☆] 发表于 2007-04-30 14:19 ·  中国 河北 保定 联通
银牌会员
★★★
积分 1,513
发帖 554
注册 2005-12-30 00:50
UID 48180
性别 男
状态 离线
运行前:在你的 D: 盘下 建立目标文件夹
md "ab\c d\e2f.exe"

我们的字符串为:
set "FilePath=d:\ab\c d\e2f.exe\xlay\cdkey"

目标:验证每一层,并给出提示。
提取出 "d:\ab\c d\e2f.exe"
最后输入:
有效路径:d:\ab\c d\e2f.exe
目标文件名:e2f.exe
目标文件属性:文件夹

可以使用P和VBS。

[ Last edited by baomaboy on 2007-4-30 at 02:53 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn +20 2007-05-01 06:33
2 发表于 2007-04-30 15:07 ·  中国 河北 保定 联通
银牌会员
★★★
积分 1,513
发帖 554
注册 2005-12-30 00:50
UID 48180
性别 男
状态 离线
Set WshSHell = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
FP="d:\ab\c d\e2f.exe\xlay\cdkey"
FPArr=split(FP,"\")
For i=1 To UBound(FPArr)
FPTest = FSO.BuildPath(FPTest,FPArr(i))
FPT=FSO.BuildPath(FPArr(0)&"\",FPTest)
If (FSO.FolderExists(FPT)) Then
WshSHell.popup "目标文件夹:“"&FPT&"”已存在。"
FolderPath=FPT
else
WshSHell.popup "目标文件夹:“"&FPT&"”不存在。"
Exit For
end if
Next
WshSHell.popup "最终有效目录:"&vbcrlf&FolderPath
Set WshSHell = Nothing
Set FSO = Nothing
WScript.Quit(0)
 

[ Last edited by baomaboy on 2008-3-25 at 12:55 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
flyinspace +3 2007-05-01 02:16
3 [p 处理版]。。写得不好请原谅。 发表于 2007-04-30 15:11 ·  中国 广东 广州 联通
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
UID 82819
性别 男
状态 离线
@echo off & setlocal EnableDelayedExpansion

set "FilePath=d:\ab\c d\e2f.exe\xlay\cdkey"

rem ----------------------------------------------------------
rem 下面这段代码为建立文件夹代码。。。可以忽略不记
if not exist "d:\ab\c d\e2f.exe" md "d:\ab\c d\e2f.exe"
rem ----------------------------------------------------------

:main
for /f "delims=\ tokens=* " %%i in ("%FilePath%") do (
set "FileName=%%~nxi"
if not exist "!FilePath!" (
call :GetLen "!FileName!"
call :GetPath !Len!
echo %FilePath%路径错误,正重新检验。
goto :main
)
echo 有效路径:!FilePath!
echo 有效文件名:!FileName!
)
goto :END
:GetPath
set "parm1=%~1"
set "FilePath=!FilePath:~0,-%parm1%!
goto :EOF
:GetLen
set aaa=%~1
set Len=0
for /l %%i in (0,1,255) do (
if "!aaa:~%%i,1!"=="" (
set /a "Len=%%i+1"
goto :EOF
)
)
goto :EOF
:END

pause
rem 清除建立的文件夹。演示完成
rd /s /q "d:\ab\c d\e2f.exe"
知,不觉多。不知,乃求知
4 发表于 2007-04-30 15:56 ·  中国 重庆 长寿区 电信
初级用户
积分 101
发帖 47
注册 2007-04-18 16:05
UID 85634
性别 男
状态 离线
LZ的题目是验证每一层,楼上的代码需稍做修改
5 发表于 2007-04-30 21:06 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
UID 68504
性别 男
来自 湖南==》广东
状态 离线
我昨天写了相关代码。今天只是将代码稍微做了改动,见笑。

::code by youxi01@cn-dos.net
::获取文件夹的名称及层数

@echo off
setlocal enabledelayedexpansion
set "FolderPath=办公\te st\tes t123\OK"
call :GetFdName "%FolderPath%"

pause>nul

:GetFdName
for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
set FPath=!FPath!\%%i
if not exist !FPath! echo %%i & GOTO :eof
call :GetFdName "%%j"
)


[ Last edited by youxi01 on 2007-4-30 at 09:07 PM ]
6 发表于 2007-04-30 22:25 ·  中国 广东 广州 联通
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
UID 82819
性别 男
状态 离线
Originally posted by youxi01 at 2007-4-30 08:06 AM:
我昨天写了相关代码。今天只是将代码稍微做了改动,见笑。

::code by youxi01@cn-dos.net
::获取文件夹的名称及层数

@echo off
setlocal enabledelayedexpa ...



呵呵,代码不合要求:)需要重写哦:)

你的代码合乎挑战1的需求。。
知,不觉多。不知,乃求知
7 发表于 2007-05-01 01:28 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
UID 68504
性别 男
来自 湖南==》广东
状态 离线
其实也符合题目要求,不过没给出全部路径而已。
稍微改动如下:

::code by youxi01@cn-dos.net

@echo off
setlocal enabledelayedexpansion
set "FolderPath=F:\办公\te st\tes t123\OK"
call :GetFdName "%FolderPath%"

pause>nul

:GetFdName
for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
if not exist !FPath!%%i\ (
echo 目标路径: !FPath!%%i不存在
echo 最终有效目录为: !FPath!
GOTO :eof
)
set FPath=!FPath!%%i\
call :GetFdName "%%j"
)
本帖最近评分记录 (共 5 条) 点击查看详情
评分人分数时间
flyinspace +3 2007-05-01 01:32
everest79 +15 2007-05-01 03:50
lxmxn +12 2007-05-01 04:46
colorphoto +2 2007-05-01 07:02
26933062 +8 2007-08-19 19:24
8 发表于 2007-05-01 02:48 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
UID 82819
性别 男
状态 离线
Originally posted by youxi01 at 2007-4-30 12:28 PM:
其实也符合题目要求,不过没给出全部路径而已。
稍微改动如下:

::code by youxi01@cn-dos.net

::code by youxi01@cn-dos.net

@echo off
setlocal enabledelayedexpansion
set "FolderPath=F:\办公\te st\tes t123\OK"
call :GetFdName "%FolderPath%"

pause>nul

:GetFdName
for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
if not exist !FPath!%%i\ (
echo 目标路径: !FPath!%%i不存在
echo 最终有效目录为: !FPath!
GOTO :eof
)
set FPath=!FPath!%%i\
call :GetFdName "%%j"
)

很妙的使用方法??

只是: call :GetFdName "%%j" 这一句话?个人认为改成 goto 比较好一点。。
知,不觉多。不知,乃求知
9 发表于 2007-05-01 05:45 ·  中国 新疆 乌鲁木齐 天山区 电信
高级用户
★★★
Autowalk
积分 845
发帖 375
注册 2007-03-03 01:58
UID 80606
性别 男
状态 离线
@echo off & setlocal enabledelayedexpansion
set fp="d:\ab\c d\e2f.exe\xlay\cdkey"

for /f "delims=\ tokens=1-5" %%a in (%fp%) do (
for %%z in (%%a,\%%b,\"%%c",\%%d,\%%e) do (set all=!all!%%z
if exist !all! (echo !all!路径正确!
set ok=!all!
) else (echo !all!路径错误!
)
)
)
echo 最终路径为 !ok!
pause


虽然检测出的路径是 d:\ab\"c d"\e2f.exe 但是不影响 if exist 的判断
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
flyinspace +1 2007-05-01 06:05
10 发表于 2007-05-01 06:16 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
UID 82819
性别 男
状态 离线
1,若能去处这个 " 就更好了。。

2,若 我们的目录层不止五层呢??

运行结果为:

d:路径正确!
d:\ab路径错误!
d:\ab\"c d"路径错误!
d:\ab\"c d"\e2f.exe路径错误!
d:\ab\"c d"\e2f.exe\xlay路径错误!
最终路径为 d:
请按任意键继续. . .

但对参与热情予以支持,加一分。
知,不觉多。不知,乃求知
11 发表于 2007-05-01 06:21 ·  中国 新疆 乌鲁木齐 天山区 电信
高级用户
★★★
Autowalk
积分 845
发帖 375
注册 2007-03-03 01:58
UID 80606
性别 男
状态 离线
目录的层数只要在tokens=1-5这里改一下,然后在第2个for中加入相应的变量参照就可以了
12 发表于 2007-05-01 06:40 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
UID 82819
性别 男
状态 离线
Originally posted by zhoushijay at 2007-4-30 05:21 PM:
目录的层数只要在tokens=1-5这里改一下,然后在第2个for中加入相应的变量参照就可以了


呵呵,但我们的目录是不确定的。。

有可能是5个,也有可能是4个。。

更有可能有10多个。。

给一个是不想生成临时文件。。
知,不觉多。不知,乃求知
论坛跳转: