如何获取具有特定驱动器名称的驱动器的驱动器号? [关闭]

Posted

技术标签:

【中文标题】如何获取具有特定驱动器名称的驱动器的驱动器号? [关闭]【英文标题】:How to get drive letter of the drive with a specific drive name? [closed] 【发布时间】:2020-10-30 18:12:52 【问题描述】:

我对批处理脚本非常陌生,我需要它来自动为多台 PC 设置文件。

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

我想使用批处理文件将闪存驱动器上的文件夹 E:\IMPDoc 复制到 PC 上驱动器名称不区分大小写的驱动器 Files。计算机没有将所有D: 都作为Files 驱动器。

如何获取驱动器名Files的驱动器盘符?

【问题讨论】:

【参考方案1】:

用于将文件夹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 prompt 窗口中运行命令行:

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

它应该显示如下:

DeviceID  
D:        

看不到的是Windows Management Instrumentation Command 的输出是Unicode 使用编码UTF-16 Little Endian 和byte order mark (BOM) 编码的,这经常会导致麻烦,因为Windows 命令处理器是为处理@987654326 的文本而设计的@ 每个字符一个字节,即 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,因为卷名使用来自后台命令句柄 STDERR2>nul 重定向处理设备 NUL 以抑制它。

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

WMIC编写的用于处理后台命令进程的STDOUT的输出被FOR捕获并在启动后逐行处理cmd.exe自行终止。

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

因此 FOR 处理的第一行是第二行。 FOR 默认使用普通空格和水平制表符作为字符串分隔符将一行拆分为子字符串,并将第一个空格/制表符分隔的字符串分配给指定的循环变量I。这种默认的行拆分行为正是此处所需要的,以获取驱动器号和冒号,而没有分配给循环变量 I 的尾随空格。

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

FOR 将驱动器号和冒号分配给循环变量I 后,执行命令块中的两个命令。所以 ROBOCOPY 将驱动器上目录 IMPDoc 中的所有文件与刚刚执行的批处理文件复制到驱动器根目录中的目录 IMPDoc 中,卷名为 Files,目标目录由 ROBOCOPY(如果不存在)。然后使用 GOTO 命令退出循环,以在标签EndBatch 下方的命令行上继续批处理文件。

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

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

另见:

Win32_LogicalDisk class 的 Microsoft 文档 DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/

【讨论】:

以上是关于如何获取具有特定驱动器名称的驱动器的驱动器号? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 osx 终端从外部硬盘驱动器中提取具有特定名称的子文件夹。

我是否可以使用bat脚本从一个闪存驱动器将文件夹安装到具有特定名称并更改驱动器的另一个闪存驱动器

枚举特定物理设备名称的逻辑驱动器

如何删除Google驱动器中具有特定扩展名的所有文件

如何在安装在 NTFS 文件夹中的驱动器上使用 GET-PSDrive 获取信息,而无需驱动器号

如何在 Visual Studio Express 2013(C++) 中获取特定驱动器的当前目录?