如何获取 Windows 上具有特定驱动器名称的驱动器的驱动器号?

How to get the drive letter of a drive with a specific drive name on Windows?

我是批处理脚本的新手,我需要它来自动为多台 PC 设置文件。

我的文件和一个批处理文件存储在闪存驱动器上。

我想(使用批处理脚本)将闪存驱动器上文件夹 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

我建议先在command promptwindow命令行中运行:

%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK where VolumeName="Files" GET DeviceID

它应该显示如下:

DeviceID  
D:        

看不到的是Windows Management Instrumentation Command is Unicode encoded using encoding UTF-16 Little Endian with byte order mark (BOM) which cause often troubles as Windows command processor is designed for processing text being character encoded的输出,每个字符一个字节,即ASCII/ANSI/OEM编码的文本。在命令提示符 window 中也看不到两行的尾随 space。

FOR 命令行导致在后台启动另一个命令进程,其中 %ComSpec% /c' 之间的命令行附加为附加参数。出于这个原因,有必要使用 ^ 转义等号以将其解释为文字字符,而不是像往常一样将 = 替换为 space 字符作为参数字符串之间的分隔符。所以在后台执行,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 以抑制它。

阅读有关 Using command redirection operators 的 Microsoft 文档,了解 2>nul 的解释。重定向运算符 > 必须在 上使用脱字符 ^ 进行转义,以便在 Windows 命令解释器处理此命令时将其解释为文字字符 Windows执行命令 FOR 之前的行,它在后台启动的单独命令进程中执行嵌入式 wmic 命令行。

WMIC处理后台命令进程STDOUT的输出被FOR[=112=捕获] 并在启动后逐行处理 cmd.exe 自行终止。

由于使用选项 skip=1 以及在处理捕获的输出时总是被 FOR 跳过的空行,因此跳过了第一行。

因此FOR处理的第一行是第二行。 FOR 默认情况下使用普通 space 和水平制表符作为字符串定界符将一行拆分为子字符串,并将第一个 space/tab 定界字符串分配给指定的循环变量 I。这种默认的行拆分行为正是这里所需要的,它只需要驱动器号和冒号,而没有将尾随 space 分配给循环变量 I.

FOR 默认情况下也会忽略第一个 space/tab 分隔字符串以分号开头的行。但是只有一行以驱动器盘符开头,因此在这种情况下不需要更改默认的行尾选项 eol=;

FOR将盘符和冒号分配给循环变量I后执行命令块中的两条命令。因此 ROBOCOPY 将驱动器上目录 IMPDoc 中的所有文件与刚刚执行的批处理文件一起复制到驱动器根目录 IMPDoc 中,卷名为 Files如果目标目录不存在,则由 ROBOCOPY 自动创建。然后使用命令 GOTO 退出循环,继续在标签 EndBatch.

下的命令行上进行批处理文件

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • pause /?
  • robocopy /?
  • setlocal /?
  • wmic /?
  • wmic logicaldisk /?
  • wmic logicaldisk get /?

另请参阅: