Windows批处理脚本获取当前驱动器名称

31

我有一个批处理文件存储在USB钥匙中。我需要知道该批处理文件所在的驱动器名称。

例如,如果它在E:\mybatch.bat中,它应该找到E:\,F:\,G:\等打开时相同。

如何在批处理脚本中实现?(Windows)


2
你想要批处理所在的驱动器还是当前工作目录的驱动器?这两者是不同的。 - Joey
8个回答

55

%CD%就是你要找的东西。它会打印批处理文件或运行它的命令的当前工作目录。如果你的批处理文件在驱动器的根目录上,它将只打印驱动器字母,否则你将不得不解析前两个字符。

例如:

echo %CD%

打印

E:\

在挂载到E盘的闪存驱动器上。

更新:正如Andriy在评论中所说,如果您只需要路径的前三个字符,则可以使用这个代替%CD%:

%CD:~0,3%

这将导致例如在驱动器的任何位置都会出现 E:\

我正在尝试配置Geany编辑器,即使我在USB上,也可以编译我的Java文件。我使用了%CD%JDK\bin\javac "%f",但它没有起作用。无论如何,您的答案是完美的,我会尽快接受您的答案。谢谢。 - SBSTP
尝试使用%CD%\而不是仅使用%CD%。否则它会寻找E:JDK\bin\javac而不是E:\JDK\bin\javac。 - John Leehey
22
%CD:~0,2% 的结果是当前驱动器的字母加上冒号。因此, %CD:~0,3% 的结果除了包含驱动器字母和冒号外,还会加上反斜杠。 - Andriy M
使用 %__CD__%,您总是在结尾处得到反斜杠。 - mousio
6
使用%cd%时要非常小心,它是程序正在执行的文件夹,而不是程序所在的文件夹。如果你将文件拖放到脚本或exe上作为该程序的参数,Windows会破坏运行路径。WinXP使其从"c:\Documents and Settings\username"文件夹运行,而Win7则使用拖放参数文件的路径。您应该使用%d0%和%p0%获取批处理文件的驱动器和位置。 - Nyerguds
显示剩余4条评论

25

1
当使用提升的权限调用批处理文件时,这是正确的使用方式! - danKV

13

注意

这个问题的现有答案没有认识到问题实际上在问两件不同的事情:

  1. 当前工作目录的驱动器(“获取当前驱动器名称”); 和
  2. 批处理文件所在驱动器(“我需要知道批处理所在的驱动器名称”)。

当批处理文件从其所在位置以外的工作目录启动时,这些可能是不同的。因此,在确定哪个解决方案与其情况相关之前,读者应清楚了解差异。

当前工作目录的驱动器

%CD:~0,2%

这将完整的当前工作目录缩减为前两个字符,即驱动器号和冒号,例如C:

批处理文件本身所在的驱动器

%~d0

这将把批处理文件的完整路径(在%0中)裁剪为仅包含驱动器字母和冒号,例如C:


(这是我被拒绝的编辑 Kai K的回答 的扩展版本)


正确的语法是 %~dp0,不要带上百分号。 - jeb
1
感谢,@jeb——已移除错误的 % 符号。但在这种情况下,我们仍保留 %~d0 而不是 %~dp0,因为我们不需要路径。 - Alex Peters

9
如果从.CMD/.BAT文件内运行,您可以使用%~dp0来获取当前/工作目录。这个命令更安全一些,因为它能够识别UNC路径等内容。有关该变量的语法参考可在这里找到。

3
不正确 @ewall:参数0始终保留批处理文件所在目录的路径,如果有人从另一个驱动器调用批处理文件,则该路径可能不是当前工作目录。即使使用完全限定的路径名调用批处理文件也无法更改当前工作目录为该路径。这就是为什么%cd%很有用——它显示当前工作目录,而不是批处理文件的位置。 - Alex T

1
你可以使用这个方法找到任何驱动器的所有USB驱动器字母。
@echo off

for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (

  if %%l equ 2 (
    echo %%i is a USB drive.
  )
)

-1
非常感谢@Sparky3489,如果我只有一个USB闪存驱动器,我会在你的算法之后放置它。
echo %%i is a USB drive.
Set FlashDrive=%%I

我还将标识符的命名方式进行了更改

Echo %%i is a USB Flash Drive~!

然后,在算法之后、之间和之外,我可以添加闪存驱动器路径,例如...

Set FlashPath=%FlashDrive%\Users\Public\Documents

然后通过设置其他路径,例如

Set SourcePath=C:\Users\Public\Documents

我可以为闪存驱动器制作批处理文件备份,(可以通过与快速启动窗口中的相关图标关联的 Windows 快捷方式进行调用 ~ 搜索“快速启动”,如果不确定我在说什么)。

Rem  * * * * * * * * * Start Batch File * * * * * * * * * *
@Echo OFF
cls
Echo FlashDrive UpDater for
Echo.
Echo Excel, Word ...
Echo * * * * * * * * * ~ Excel SpreadSheets ~ * * * * * * * * *
XCopy /D /I /V /Y /U /S "%SourcePath%\Excel Documents\*.*" "%FlashPath%\Excel Documents\"
Echo * * * * * * * * * ~ Word Documents ~ * * * * * * * * *
XCopy /D /I /V /Y /U /S "%SourcePath%\Word Documents\*.*" "%FlashPath%\Word Documents\"
Echo.
Echo.
Echo FlashDrive = %FlashDrive%
Echo FlashPath = %FlashPath%
Echo.
Echo * Bonus Switch Info * * * * *
Echo * XCopy Switch  /D ~ Copies Files Changed On or After the Specified Date.
Echo *          {If no Date is Given, Copies only those Files whose
Echo *          Source Time is Newer than the Destination Time}.
Echo * XCopy Switch  /I ~ Copies More than One File to Destination (Assumes Destination is a Directory)
Echo * XCopy Switch  /S ~ Copies Directories and Subdirectories Except Empty Ones
Echo * XCopy Switch  /V ~ Verifies Each New File.
Echo * XCopy Switch  /U ~ Copies only Files that Already Exist in Destination.
Echo * XCopy Switch  /Y ~ Suppresses Prompting to Confirm You Want to Overwrite an Existing Destination File.
Echo.
Rem for More Info on XCopy Switches GoTo http://support.microsoft.com/kb/128756
Echo Directory Path = %~DP0
Echo.
Echo * Batch File Name = %0 *
Echo.
Rem Echo %CD:~0,2%, {Returns "Drive Letter & Colon"}
Rem Echo %CD:~0,3%, {Returns "Drive Letter & Colon & BackSlash"}
Pause
cls
Pause
Exit
Rem  * * * * * * * * * End Batch File * * * * * * * * * *

-1

就像其他人所说的%~d0

没有必要再次讨论这个问题,但如果你偶然进入了这个线程,那么这将会将cd到批处理文件所在的目录。

@echo off
set "fullDir=C:\Program Files"
cd /d %fullDir%                                &rem changes to the full directory 'C:\Program Files'.
echo You're now cd' in the '%cd%' directory.
pause

如果您想从另一个驱动器(例如Z:)运行批处理文件,则可以使用此方法。

cd /d %~d0                                     &rem Changes to the current directory
echo You're now cd' in the '%cd%' directory.   &rem This is now your full path of the batch file cd' into.
pause

-1
%CD:~0,2%

这将以格式 C: 的形式提供当前驱动器,即当前工作目录的前两个字符

C:\Users\ashish>ECHO %CD:~0,2%
C:

D:\projects>ECHO %CD:~0,2%
D:

D:\projects>ECHO %CD%
D:\projects

3
与2011年接受的答案相同-不包括解释。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接