2 楼的代码:
首先把没有 任何分隔的 全路径串 以 冒号 : 作分隔,
选择 : 是因为其在全路径中是必有的, 且一条路径只可能包含一个
%str::=^" ^"%
将一个 冒号 变成了两个 双引号 隔着一个 空格,
后文中使用了
!p:~0,-1!
的形式, 所以为了让最后一段路径也通用, 就再在尾部加了一个空格,
再加上括号对作 保护, 防止 空格 在编辑过程中 被忽略 或者 被 增多.
(set str=%str::=^" ^"% )
for %%a in ("%str%")
这里 又在 str 内容 的 头和尾各加了一个双引号, 从而形成类似这样的形式
for %%a in ("ab c" "de" "fg hi")
其中, b和c之间, g和h之间 的空格因为都在 匹配的双引号对 内部,
所以不会成为 for 解析的分隔符, 从而得以保留
而下面的
%%~a
使用 又会将存在(不存在也不影响)的双引号对给脱去.
!last:~-1!
获得每一个路径的盘符(被分离到了上一个路径的尾部)
%%a 第一次获得的值仅仅是一个盘符,
而此时, last 恰好也没有定义, 所以
if defined last echo,!last:~-1!:!p:~0,-1!
略过此次输出.
若反复多次运行
for %%a in ("%str%") do (
...
)
则应在前面加上 last 的初始化:
set "last="
楼主这样的语句是不能按预期执行的:
if !choice!=="1" goto 1
所以实际使用中, 第 12 -- 21 行的 goto 语句从没有执行过,
而是顺序运行到 第 24 行.
所以, 第 50 -- 266 行代码其实都成了死代码
(逻辑上可以运行到(输入 "1" 等时), 但实际没有运行到)
应改为
if "!choice!"=="1" goto 1
这里, 楼主代码中 choice 的跳转方式是不可取的,
而且 临时文件 完全是没有必要的.
依楼主的意图, 可以用 数组 来记录那些目标目录.
下面给出一段示例代码, 请楼主找到其中的技巧, 从而加以利用简化自己的代码.- @echo off
- setlocal enabledelayedexpansion
- set "i=0"
- for /f "tokens=*" %%i in ('dir /b /ad') do (
- set /a i+=1
- set "d_!i!=%%~dpnxi"
- set "i= !i!. "
- echo,!i:~-5!%%~dpnxi
- )
- pause
- set d_
- pause
- set "indDest=3"
- for %%i in (!indDest!) do set "destDefault=!d_%%i!"
- set /p "indDest=请输入目标目录对应的序号(当前默认目录为 !indDest!. !destDefault!, 选择默认目录直接回车): "
- for %%i in (!indDest!) do echo,选择了 !d_%%i!
- pause
复制代码 |