通过DOS命令获取当前文件夹名称?


58

是否可以使用DOS命令获取当前文件夹名称(而不是当前目录路径)?如果是这样,怎么办?

我最接近的是这个,但它没有做到:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

注意:上面的尝试是我尝试对字符串进行标记化并获取最后一个标记集作为CURR变量。


如果您安装了某种GNU工具集,则应该可以cd | sed "s/.*\\//"(将cd(cwd)的输出通过管道输入到正则表达式中进行搜索和替换,将最终\之前的所有内容全部
替换为空

2
我需要避免使用GNU工具,以便批处理文件对任何人都可以使用。无论如何,我的问题是“纯DOS”。
djangofan

好的。一个快速的谷歌显示了一个在VBScript中实现正则表达式搜索和替换的SO结果(stackoverflow.com/questions/127318/…),它可以使用相同的语法并创建相同的结果-我相信VBScript自Windows 98以来就已内置,因此每个人都应该在任何地方!(您也可以很轻松地将其重新调整为在* nix OS'上运行)
Phoshi

3
仅供参考,MS-DOS中都不支持for /fTomWij %~n*。(Windows的cmd.exe不是DOS,这是一个原生的Windows程序。)
grawity

Answers:


84

我发现的最短方法:

for %I in (.) do echo %~nxI

或在.bat脚本中:

for %%I in (.) do echo %%~nxI

或在.bat中使用在变量中获取值。

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

说明:http : //www.robvanderwoude.com/ntfor.php

nx表示仅文件名和扩展名


我喜欢链接和建议,但是当我将其放在批处理文件中时,我会立即关闭外壳,没有任何输出。某处一定有语法错误?
djangofan

3
该示例将在命令行上交互工作。要在批处理文件中使用它,你需要替换所有出现的%%%
Mike Fitzpatrick 2010年

2
另外,该示例无法正确处理包含句点(.)的文件夹名称,例如我的%USERPROFILE%文件夹。
Mike Fitzpatrick 2010年

1
是的,如果您将“%”替换为“ %%”,则可以使用。好答案。如果前面已经指出,那将是公认的答案。
djangofan 2012年

1
不管这可怕的邪恶法术是什么,我都很高兴它能起作用。我对大多数扩展语法都很熟悉,但*在oo之前我从未见过使用它
kayleeFrye_onDeck

30

如果您想知道批处理文件的当前位置(如果您的Windows不是很老的版本),请for /?在“ DOS box”窗口中键入。向下滚动。读。

你会发现,你现在可以(从阅读的批处理文件)这些变量:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

这适用于许多情况。假设批处理文件名为mytest.bat。您可以用不同的方式称呼它:

  1. ..\..\to\mytest.bat ............................... (相对路径)
  2. d:\path\to\mytest.bat........................... (完整路径)
  3. \\fileserver\sharename\mytest.bat... (远程共享上的路径)

...并且您将始终在变量中获得正确的值。


1
哇,有趣的是你的权利。命令“ echo%〜dp0”也解决了我的问题,它更优雅。
djangofan 2010年

5
那好吧-那就给我颁个+1吧?
Kurt Pfeifle,2010年

不,因为“是/?” 是我看过的最明显的第一名,所以这个答案并不比任何人所期望的要好。
djangofan 2012年

4
@djangofan:所以你已经知道的事情说“哇,有趣的是,你是对的……”!对您的知识没有帮助的答案?(您知道,“ + 1”是单击^箭头的方式,它与做出已接受的答案是不同的...。)
Kurt Pfeifle12年

1
似乎最后一个应该是%~dpnx0,不是吗?
luc

15

我个人喜欢汤姆斯的答案,直到它在目录名中出现点为止。给了我一个提示:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa

5

Tom的回答很好,但是如果您的目录名称中带有句点(即wxwidgets-2.9.4),则只会获得全名。因此,这将输出wxwidgets-2.9,因为.4已被视为扩展名(是的,即使它是目录名!)。

要获得完整的输出名称,您必须在扩展名的末尾添加:

FOR %I IN (.) DO Echo %~nI%~xI

并在批处理文件模式下:

FOR %%I IN (.) DO Echo %%~nI%%~xI

或者,当然,也可以在批处理文件中设置一个变量:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

另一种方法是:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

它与“。” 和路径名中的空格

它有什么作用?

  1. 将整个文件名(driveletter-path-filename-extension)放入MyPathVar

  2. MyPathvar中删除文件名和扩展名

它还与UNC路径一起使用。如果需要在路径的末尾使用反斜杠。在第二个set命令中删除\after MyPath,例如。

set "MyPath=%%MyPath:%~nx0=%%"

1
那么,这与%~dp0
Amit Naidu

4

您可以将当前目录添加到变量中。单线:

set a=%cd%

检查与

echo %a%

6
他需要当前目录名,而不是整个路径,并且作为a == cd,您也可以使用%cd%。
paradroid

2

很简单

for %%d in ("%CD%") do echo %%~nxd

要么

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

注意路径末尾的反斜杠,它不一定是末尾的反斜杠。


1

我在此线程中的回答仅用 3行即可:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

这从批处理文件为我工作。它返回当前的工作目录名称。

pushd %1 & for %%i in (.) do @echo %%~ni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.