无忧启动论坛

标题: 参数%~1\..的上级目录如何显示实际目录? [打印本页]

作者: singel    时间: 2012-3-10 19:20
标题: 参数%~1\..的上级目录如何显示实际目录?
比如%~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 编辑 ]
作者: dos时代菜鸟    时间: 2012-3-10 20:45
我这里只给你一个 样例,应该可以更简化的。自己研究吧,有时间我们在研究。

@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%
作者: pznpt    时间: 2012-3-10 20:49
%~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 编辑 ]
作者: singel    时间: 2012-3-10 23:35
多谢楼上两位大哥,复制研究(∩_∩)
作者: dos时代菜鸟    时间: 2012-3-11 11:47
下面 脚本内容 需要附带参数运行。将 目录 作为 %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 编辑 ]
作者: pznpt    时间: 2012-3-11 16:11
模仿 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%%%
复制代码



作者: dos时代菜鸟    时间: 2012-3-11 18:06
  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 编辑 ]
作者: singel    时间: 2012-3-16 17:33
学习了,O(∩_∩)O
作者: 2011hnfeng    时间: 2012-3-23 17:45
看晕了
各位都是高手啊
作者: x9tian    时间: 2012-4-17 14:05
标题: 其实批处理还有这个规则
  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 编辑 ]




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3