windows command(15):SHIFT及参数编辑符%~dp0

shift.png

本文介绍了bat脚本支持的参数,SHIFT命令替换bat脚本参数位置。

batch脚本支持的参数

支持%1~%9,9个参数,%0表示命令本身。如果写成%10,则是表示%1之后跟一个0.

parameters.bat
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
echo 0: %0
echo 1: %1
echo 2: %2
echo 3: %3
echo 4: %4
echo 5: %5
echo 6: %6
echo 7: %7
echo 8: %8
echo 9: %9
echo 10: %10

运行结果:

result
1
2
3
4
5
6
7
8
9
10
11
12
D:\test\test>paramters.bat hello 1 2 3 4 5 6 7 8 9
0: paramters.bat
1: hello
2: 1
3: 2
4: 3
5: 4
6: 5
7: 6
8: 7
9: 8
10: hello0

参数编辑

可以在批处理参数中使用编辑符。编辑符使用当前的驱动器和目录信息将批处理参数作为部分或完整的文件或目录名进行扩展。要使用编辑符,请键入百分号 (%) 字符,后面是波形符号 (~) 字符,然后键入合适的编辑符(即 %~modifier)。
下表列出了可在扩展中使用的编辑符。

modifier Description
%~1 扩展 %1 并删除任何外围引号 (“”)
%~f1 将 %1 扩展到完全合格的路径名
%~d1 将 %1 扩展到驱动器盘符
%~p1 将 %1 扩展到路径
%~n1 将 %1 扩展到文件名
%~x1 将 %1 扩展到文件扩展名
%~s1 扩展的路径仅包含短名称
%~a1 将 %1 扩展到文件属性
%~t1 将 %1 扩展到文件日期/时间
%~z1 将 %1 扩展到文件大小
%~$PATH:1 搜索 PATH 环境变量中列出的目录,并将 %1 扩展到第一个找到的目录的完全合格名称。如果没有定义环境变量名称,或没有找到文件,则此编辑符扩展成空字符串

以上编辑符可以组合使用:

modifier Description
%~dp1 将 %1 扩展到驱动器盘符和路径
%~nx1 将 %1 扩展到文件名和扩展名
%~ftza1 将 %1 扩展到类似 dir 的输出行
%~dp$PATH:1 在 PATH 环境变量列出的目录中搜索 %1,并扩展到第一个找到的目录的驱动器盘符和路径
parameters.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
echo ~0 : %~0
echo ~f0: %~f0
echo ~d0: %~d0
echo ~p0: %~p0
echo ~n0: %~n0
echo ~x0: %~x0
echo ~s0: %~s0
echo ~a0: %~a0
echo ~t0: %~t0
echo ~z0: %~z0
echo ~PATH0: %~$PATH:0
echo ~dp0: %~dp0
echo ~nx0: %~nx0
echo ~ftza0: %~ftza0
result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
~0 : paramters.bat
~f0: D:\test\test\paramters.bat
~d0: D:
~p0: \test\test\
~n0: paramters
~x0: .bat
~s0: D:\test\test\paramters.bat
~a0: --a--------
~t0: 2016/04/03 21:37
~z0: 536
~PATH0:
~dp0: D:\test\test\
~nx0: paramters.bat
~ftza0: --a-------- 2016/04/03 21:37 536 D:\test\test\paramters.bat

支持超过9个参数

SHIFT命令可以支持超过9个参数输入。

parameters_shift.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
echo 0: %0
echo 1: %1
echo 2: %2
echo 3: %3
echo 4: %4
echo 5: %5
echo 6: %6
echo 7: %7
echo 8: %8
echo 9: %9
echo 10: %10
shift
echo 0: %0
echo 1: %1
echo 2: %2
echo 3: %3
echo 4: %4
echo 5: %5
echo 6: %6
echo 7: %7
echo 8: %8
echo 9: %9
echo 10: %10

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
D:\test\test>parameters_shift.bat hello 1 2 3 4 5 6 7 8 9
0: parameters_shift.bat
1: hello
2: 1
3: 2
4: 3
5: 4
6: 5
7: 6
8: 7
9: 8
10: hello0
0: hello
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10

选择性替换

如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

应用

拷贝任意个文件到指定文件夹

mycopy.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
rem MYCOPY.BAT copies any number of files
rem to a directory.
rem The command uses the following syntax:
rem mycopy dir file1 file2 ...
set todir=%1
:getfile
shift
if "%1"=="" goto end
copy %1 %todir%
goto getfile
:end
set todir=
echo All done

Reference:

help SHIFT
1
2
3
4
5
6
7
8
9
10
更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

cmd批处理参数