我正在编写一个脚本,其中我将获取一个文件名作为参数。该文件将是绝对文件。(理想情况下,解决方案也支持相对文件,但我只能接受绝对文件)。不知道该文件是否已经存在。
我想要获取文件的驱动器号。
例子:
myScript.bat C:\exampleFolder\somefile.txt D:\someOtherFolder\differentfile.txt
我的脚本.bat:
echo First argument: %1
echo Second argument: %2
REM Its the next line I have trouble with.
echo Drive letter of second argument: %MAGIC%2
预期输出:
First argument: C:\exampleFolder\somefile.txt
Second argument: D:\someOtherFolder\differentfile.txt
Drive letter of second argument: D:
上下文:我想编写一个脚本来执行一些文件复制。但文件可能只会一次出现在目标位置。一旦创建,它就必须已经完成。所以我想编写一个脚本来复制文件TARGET_DRIVE\tmp
,然后将其移动到目标位置。
我考虑将驱动器号作为第三个参数传递。但这似乎很麻烦。
答案1
我想在第二个参数中获取文件的驱动器号
使用%~d2
。
我的脚本.bat:
@echo off
echo First argument: %1
echo Second argument: %2
echo Drive letter of second argument: %~d2
示例输出:
F:\test>myScript C:\exampleFolder\somefile.txt D:\someOtherFolder\differentfile.txt
First argument: C:\exampleFolder\somefile.txt
Second argument: D:\someOtherFolder\differentfile.txt
Drive letter of second argument: D:
F:\test>
参数扩展
当使用参数来提供文件名时,可以应用以下扩展语法:
我们正在使用变量 %1(但这适用于任何参数)
%~f1 将 %1 扩展为完全限定路径名 - C:\utils\MyFile.txt
%~d1 将 %1 仅扩展为驱动器号 - C:
%~p1 将 %1 仅扩展为一个路径,例如 \utils\,这包括一个尾随的 \,某些命令会将其解释为转义字符。
%~n1 将 %1 扩展为不带文件扩展名的文件名 C:\utils\MyFile,或者如果仅存在路径(没有尾随反斜杠)- 则为该路径中的最后一个文件夹。
%~x1 将 %1 扩展为文件扩展名 - .txt
%~s1 更改 f、n、s 和 x 的含义以引用 Short 8.3 名称(如果存在)。
%~1 展开 %1 并删除所有引号 (")
%~a1 显示 %1 的文件属性
%~t1 显示 %1 的日期/时间
%~z1 显示 %1 的文件大小
%~$PATH:1 搜索 PATH 环境变量并将 %1 扩展为找到的第一个匹配项的完全限定名称。
上面的修饰符可以组合使用:
%~dp1 将 %1 仅扩展为驱动器号和路径
%~sp1 将 %1 扩展为缩短为 8.3 个字符的路径
%~nx2 将 %2 仅扩展为文件名和扩展名
来源参数
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 参数- 命令行参数(或参数)是传递到批处理脚本的任何值。