无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3863|回复: 9
打印 上一主题 下一主题

参数%~1\..的上级目录如何显示实际目录?

[复制链接]
跳转到指定楼层
1#
发表于 2012-3-10 19:20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如%~1=C:\A\B\C\D\E

set p1=%~1

set p2=%p1%\..

set p3=%p2%\..

echo 路径1=%p1%

echo 路径2=%p2%

echo 路径3=%p3%

运行后显示的是:

路径1=C:\A\B\C\D\E\..

路径2=C:\A\B\C\D\E\..\..

路径3=C:\A\B\C\D\E\..\..\..

而不是:

路径1=C:\A\B\C\D\

路径2=C:\A\B\C\

路径3=C:\A\B\

我想显示后一种结果参数应该怎么写?

[ 本帖最后由 singel 于 2012-3-10 19:28 编辑 ]
2#
发表于 2012-3-10 20:45:35 | 只看该作者
我这里只给你一个 样例,应该可以更简化的。自己研究吧,有时间我们在研究。

@echo off
set p0=C:\Abcde\Bcdef\Cdefg\Defgh\Efghijk
echo p0=%p0%
set p1=%p0:~0,-1%
:loop1
if %p1:~-1%==\ goto 1
set "p1=%p1:~0,-1%"
goto loop1
:1
echo p1=%p1:~0,-1%
set p2=%p1:~0,-1%
:loop2
if %p2:~-1%==\ goto 2
set "p2=%p2:~0,-1%"
goto loop2
:2
echo p2=%p2:~0,-1%
set p3=%p2:~0,-1%
:loop3
if %p3:~-1%==\ goto 3
set "p3=%p3:~0,-1%"
goto loop3
:3
echo p3=%p3:~0,-1%
回复

使用道具 举报

3#
发表于 2012-3-10 20:49:30 | 只看该作者
%~1只是去掉%1外面的引号。要扩展为驱动器和路径,使用%~dp1这样的形式。楼主试试这样:
  1. @echo off
  2. set "pth=C:\A\B\C\D\E"
  3. for /f "delims=" %%a in ("%pth%") do (
  4.    echo 路径1=%%~dpa
  5.    for /f "tokens=1,2" %%b in ("%%~dpa. %%~dpa..") do (
  6.       echo 路径2=%%~dpb
  7.       echo 路径3=%%~dpc
  8.    )
  9. )
  10. pause
复制代码


下面的应该直观些,且路径中可以包含空格:
  1. @echo off
  2. set "pth=C:\A\B\C\D\E"
  3. call :1 "%pth%"
  4. :1
  5. set "p1=%~pd1"
  6. echo 路径1=%p1%
  7. call :2 "%p1%."
  8. :2
  9. set "p2=%~pd1"
  10. echo 路径2=%p2%
  11. call :3 "%p2%."
  12. :3
  13. set "p3=%~pd1"
  14. echo 路径3=%p3%
  15. pause
复制代码

[ 本帖最后由 pznpt 于 2012-3-11 00:43 编辑 ]
回复

使用道具 举报

4#
 楼主| 发表于 2012-3-10 23:35:24 | 只看该作者
多谢楼上两位大哥,复制研究(∩_∩)
回复

使用道具 举报

5#
发表于 2012-3-11 11:47:08 | 只看该作者
下面 脚本内容 需要附带参数运行。将 目录 作为 %1 参数调用。
适合 n 多 子目录,支持 空格。
要求 当 目录附带空格,需要将目录用引号包裹最后一个子目录 后面不要有 “\ ”%1 必须是绝对路径

改了一下,受到pznpt 启发,用到了 %~1 ,原来我用 for 搞复杂了。呵呵
  1. @echo off
  2. echo p0=%~1
  3. set "px=%~1" & set /a n=0
  4. :loop_
  5.   if "%px:~-1%"==""  set /a n+=1
  6.   if "%px:~-1%"==""  (set p%n%=%px% & echo p%n%=%px%)
  7.   set "px=%px:~0,-1%"
  8.   if "%px:~-1%"==":" goto endx
  9. goto loop_
  10. :endx
复制代码


[ 本帖最后由 dos时代菜鸟 于 2012-3-11 18:24 编辑 ]
回复

使用道具 举报

6#
发表于 2012-3-11 16:11:54 | 只看该作者
模仿 DOS时代菜鸟 大大的,呵呵。
  1. @echo off
  2. if not "%~1"=="" (set "pth0=%~1") else set "pth0=C:\A\B\C\D\E"
  3. echo 路径0=%pth0%&set "pth=%pth0%"

  4. :st
  5. call :lp "%pth%."
  6. if not "%pth:~3%"=="" (goto st) else pause&set n=&goto :eof

  7. :lp
  8. set/a n+=1&set "pth=%~dp1"
  9. set "pth%n%=%~dp1"
  10. call echo 路径%n%=%%pth%n%%%
复制代码


回复

使用道具 举报

7#
发表于 2012-3-11 18:06:49 | 只看该作者
  1.   if "%px:~-1%"==""  set /a n+=1
  2.   if "%px:~-1%"==""  (set p%n%=%px% & echo p%n%=%px%)
复制代码
  1.   if "%px:~-1%"==""  (set /a n+=1 & set p%n%=%px% & echo p%n%=%px%)
复制代码
效果是不一样的。

原来,第二段代码中命令 set  n+=1  要跟随 if ... () 语句 括号中全部语句都 运行以后才会生效,也就是 if 作为一条语句执行完成的。

[ 本帖最后由 dos时代菜鸟 于 2012-3-11 18:16 编辑 ]
回复

使用道具 举报

8#
 楼主| 发表于 2012-3-16 17:33:09 | 只看该作者
学习了,O(∩_∩)O
回复

使用道具 举报

9#
发表于 2012-3-23 17:45:58 | 只看该作者
看晕了
各位都是高手啊
回复

使用道具 举报

10#
发表于 2012-4-17 14:05:07 | 只看该作者

其实批处理还有这个规则

  1. set lg=d:\a\b\c\d\e\f\g\h\f
  2. goto :loop
  3. echo/%lg%ping /n 2 127.0.1>nul&&exit
  4. :loop
  5. if %lg:~-2%#==:\#   goto :eof
  6. for %%i in ("%lg%") do echo/%%~dpi&set "lg=%%~dpi"&goto :loop
复制代码
像现在pe里面挂网启服务的那个批处理脚本那个截取ip地址前缀的地址那个for语句完全没必要,一句%~ni搞定了。

[ 本帖最后由 x9tian 于 2012-4-17 14:13 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-3 03:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表