如何获取 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 /?
另请参阅:
- Win32_LogicalDisk class
的 Microsoft 文档
- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
我是批处理脚本的新手,我需要它来自动为多台 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 /?
另请参阅:
- Win32_LogicalDisk class 的 Microsoft 文档
- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/