我对批处理脚本非常陌生,我需要它来自动为多台电脑设置文件。
我的文件和批处理文件存储在闪存驱动器上。
我想将闪存驱动器上文件夹
E:\IMPDoc
中的文件(使用批处理脚本)复制到 PC 上具有不区分大小写的驱动器名称 Files
的驱动器。并非所有计算机都具有 D:
作为 Files
驱动器。
如何获取名为
Files
的驱动器的盘符?
用于将文件夹
IMPDoc
从存储批处理文件的驱动器复制到卷名称为 Files
的驱动器的批处理文件代码为:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=1" %%I in ('%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK where VolumeName^="Files" GET DeviceID 2^>nul') do (
%SystemRoot%\System32\robocopy.exe "%~d0\IMPDoc" "%%I\IMPDoc" /R:1 /W:1 /NDL /NFL /NJH /NJS
goto EndBatch
)
echo ERROR: Found no drive with volume name "Files".
echo(
pause
:EndBatch
endlocal
我建议首先在命令提示符窗口中运行命令行:
%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK where VolumeName="Files" GET DeviceID
它应该显示如下:
DeviceID
D:
看不到的是 Windows Management Instrumentation Command 的输出是使用 UTF-16 Little Endian 和 字节顺序标记 (BOM) 进行 Unicode 编码,这通常会导致问题,因为 Windows 命令处理器是设计用于处理每个字符一个字节的“字符编码”文本,即 ASCII/ANSI/OEM 编码文本。两行中也有尾随空格,在命令提示符窗口中也看不到。 FOR
命令行会在后台启动另一个命令进程,其中%ComSpec% /c
以及 '
之间的命令行作为附加参数附加。因此,有必要使用
^
转义等号,将其解释为文字字符,而不是像往常一样将
=
替换为空格字符,作为参数字符串之间的分隔符。因此在后台执行,Windows 安装到目录中
C:\Windows
:
C:\Windows\System32\cmd.exe /c C:\Windows\System32\wbem\wmic.exe LOGICALDISK where VolumeName="Files" GET DeviceID 2>nul
在找不到驱动器时,WMIC输出的错误不区分大小写,解释字符串
Files
作为卷名称,使用2>nul
从后台命令进程的句柄STDERR
重定向到设备NUL以抑制它。 阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
2>nul
的说明。重定向运算符 >
必须在FOR
命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令FOR(执行嵌入的
wmic
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程。
由WMIC 编写的用于处理后台命令进程的
STDOUT 的输出由 FOR 捕获,并在启动 cmd.exe
自行终止后逐行处理。
由于使用了选项
skip=1
,以及在处理捕获的输出时总是由 FOR
跳过的空行,因此会跳过第一行。因此FOR处理的第一行是第二行。默认情况下,
FOR 使用普通空格和水平制表符作为字符串分隔符将一行拆分为子字符串,并将第一个空格/制表符分隔字符串分配给指定的循环变量I
。这种默认的行分割行为正是此处所需要的,以便仅获取驱动器号和冒号,而无需将尾随空格分配给循环变量I
。默认情况下,FOR 也会忽略第一个空格/制表符分隔字符串以分号开头的行。但只需要处理以驱动器号开头的一行,因此在这种情况下不需要更改默认的行结束选项
eol=;
。
I
后执行命令块中的两个命令。因此,ROBOCOPY
将驱动器上目录
IMPDoc
中的所有文件与刚刚执行的批处理文件复制到卷名称为IMPDoc
的驱动器根目录中的目录
Files
,其中目标目录由ROBOCOPY
自动创建(如果尚未创建)现存的。然后使用命令GOTO 退出循环,继续在标签
EndBatch
下面的命令行上进行批处理文件处理。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
for /?
goto /?
pause /?
robocopy /?
setlocal /?
wmic /?
wmic logicaldisk /?
wmic logicaldisk get /?
Win32_LogicalDisk 类的 Microsoft 文档