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

问题描述 投票:0回答:1

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

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

我想将闪存驱动器上文件夹

E:\IMPDoc
中的文件(使用批处理脚本)复制到 PC 上具有不区分大小写的驱动器名称
Files
的驱动器。并非所有计算机都具有
D:
作为
Files
驱动器。

如何获取名为

Files
的驱动器的盘符?

windows file batch-file copy
1个回答
2
投票

用于将文件夹

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=;

FOR

将驱动器号和冒号分配给循环变量

I后执行命令块中的两个命令。因此,ROBOCOPY

将驱动器上目录
IMPDoc中的所有文件与刚刚执行的批处理文件复制到卷名称为IMPDoc
的驱动器根目录中的目录
Files
,其中目标目录由
ROBOCOPY
自动创建(如果尚未创建)现存的。然后使用命令 
GOTO 退出循环,继续在标签 EndBatch 下面的命令行上进行批处理文件处理。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

echo /?
  • endlocal /?
  • for /?
  • goto /?
  • pause /?
  • robocopy /?
  • setlocal /?
  • wmic /?
  • wmic logicaldisk /?
  • wmic logicaldisk get /?
  • 另请参阅:

Win32_LogicalDisk 类的 Microsoft 文档

© www.soinside.com 2019 - 2024. All rights reserved.