批处理怎样判断一个路径是文件还是文件夹

给定一个路径,批处理怎样判断它是个文件还是文件夹?
还有,如果我这样写:
for /f %%i in ('dir /b d:\test') do (
  if %%i 是文件夹 (do something ......)
  if %%i 是.exe文件或者是.bat文件 (do something ......)
)
dir /b d:\test 只是得到一些文件和文件夹名字,要从这些名字中实现上述条件结构,用批处理该怎么实现?请大家帮忙。


回答1

REM 判断要复制的是文件还是目录
FOR %%i IN ("%FileName%") DO SET FileAttrib=%%~ai
IF %FileAttrib:~0,1%==d (
    GOTO COPYDIR
) ELSE (
    GOTO COPYFILE
)

回答2

@echo off
    for /f "delims=" %%i in ('dir /a/b/s') do pushd "%%i" 2>nul && (call :folder "%%i" & popd) || call :file "%%i"
    pause
goto :eof

:file
    echo %~1 是文件
goto :eof

:folder
    echo %~1 是目录
goto :eof

if结构在某些时候需要开启延迟的环境变量,所以个人还是喜欢&&和||而不喜欢用if.

些时候需要开启延迟的环境变量,所以个人还是喜欢&&和||而不喜欢用if.
--------------------------------------------------------
谢谢你的解答,但我想用批处理实现下述结构呀,该怎么搞?
for /f %%i in ('dir /b d:\test') do (
if %%i 是文件夹 (do something ......)
if %%i 是.exe文件或者是.bat文件 (do something ......)
)
-------------------------------------------------------- 
对了,上面的%errorlevel%需要在你的系统下自己查看,我这里win7,pushd错误返回1. 
pushd %%i 2>nul && (echo 目录 & popd )|| echo 文件
或者:
pushd %%i 2>nul
if %errorlevel% == 1 (echo 文件
)else(echo 目录)
大概就是这样吧,具体的语法不大记得了,不知道上面的能不能正常执行。
另外可以通过dir /ad/b/s来获得所有目录,dir /a-d/b/s来获得所有非目录。
个人认为在dir里面区别对待文件和目录是提高效率的做法。

 

 

出处:https://bbs.csdn.net/topics/360126535

=======================================================================================

从cmd批处理文件中的变量获取目录路径

在批处理文件中,我有一个包含文件路径的变量:

1
SET VAR1=C:\\Folder1\\Folder2\\File.txt

我想提取目录结构并检索:

1
C:\\Folder1\\Folder2\\

我已阅读像这样的线程,我需要使用%~dp0,其中0我相信是作为参数传递的。我已经尝试过%~dpVAR1,但这是行不通的。

如何获取想要的输出,但是带有包含文件路径的变量?

此外,要使事情变得困难,我必须在IF条件下执行所有这些操作,这意味着一旦声明了变量,我将需要用!而不是%引用它(我在脚本的开头声明了setlocal enableextensions enabledelayedexpansion来允许这样做)。

任何帮助都是非常感谢!

谢谢!

 

安德鲁


您正在尝试在环境变量上使用参数扩展语法-无法使用。但是,执行所需的操作相对容易。

使用CALL(相对较慢):

1
2
3
4
5
6
7
8
9
(...
  call :getPath"!var!" var
  ...
)
exit /b

:getPath
set"%2=%~dp1"
exit /b

使用FOR,假定变量不包含任何通配符(快速)

1
2
3
4
(...
  for %%F in ("!var!") do set"var=%%~dpF"
 ...
)

使用FOR,如果变量可能包含通配符(也很快速)

1
2
3
4
(...
  for /f"delims=" %%F in ("!var!") do set"var=%%~dpF"
 ...
)

注1:如果变量不包含完整路径,则所有解决方案都将尝试解析名称转换为绝对路径,并将返回完整的绝对路径。例如,如果var包含foobar\\test.txt,则解决方案将包括当前目录的完整路径,即使未找到该文件。像c:\\pathToCurrentDirectory\\foobar\\。

之类的注2:上面的所有解决方案都会删除路径中的所有引号。

注3:路径中可能包含!字符,这将在出现以下问题时引起问题扩展%~dp1或%%~dpF,因为您已启用延迟扩展。如果该值包含!,则延迟的扩展将破坏^和!。有一种解决方案涉及同时保护!和^。这是应用于以上最后一个解决方案的演示。该保护要求正常扩展,并且由于您位于代码块内,因此至少需要一个CALL。可以不使用子例程来完成,但是使用子例程会更容易。该子例程假定变量名为var。

1
2
3
4
5
6
7
8
9
10
11
12
(...
  call :getPath
 ...
)
exit /b

:getPath
set"var=!var:"=!"
set"var=!var:^=^^^^!"
set"var=%var:!=^^^!%" !
for /f"delims=" %%F in ("!var!") do set"var=%%~dpF" !
exit /b
 
  • 知道为什么您的第二个示例仅在删除引号和感叹号后才对我有用吗?
  • @fordareh-???问题是明确地试图从变量的内容中提取路径信息。没有感叹号,它就无法工作。您必须做的事情与问题不直接相关。

 

 


我确实相信(再次),许多问题都在同一主题上(字符串约束或拆分字符串)。

不是给您完整的代码,而是给您一个模板,并解释为什么%~dpVAR!不起作用。

首先,为什么%~dpVAR!不起作用。

在进入修饰符之前,让我们讨论参数。您可能知道批处理文件可以相互解析参数。可以通过在数字0-9前面使用单个百分号(%)来调用这些参数。据我所知(可能有人解析了更多方法),只能解析9个参数。您可能会认为这是错误的(有10个参数正确吗?)。参数1-9解析到批处理文件(或函数中的一个),%0是批处理文件(或函数名)的文件路径。如果您看,%~dp0与%0有一些(实际上不是)相似之处。这将在下面讨论。

其次,术语%~dp0中包含修饰符。修饰符是用于修改变量(仅在参数和在for循环中声明的变量的情况下,您知道带有双百分号的变量,例如%% i)和参数的事物。修饰符d仅将参数扩展为驱动器号,而p则将参数扩展为仅路径。您可能会认为它们会相互矛盾,但是可以组合使用参数来创建极其古怪的格式。

因此,正如您所看到的,您尝试用变量名替换0失败,因为未为此类设置指定变量名。

现在,转到模板。

您可以像这样约束变量(并将它们放入其他变量中):set variable=!variable:~offset,amount!

 

 

请不要担心,这似乎令人困惑,我将解释这些组件。

首先,请注意没有/a开关。这是因为这不是数学函数(不知道为什么要添加此函数)。因此,在我解释它之前,下面是一个示例,该示例将对具有0123456789值的变量名称numbers进行处理。

1
set numbers=!numbers:~5,1!

使用该行代码numbers现在等于5。这是因为它正在使用较小值的原始值重新创建变量(这很难解释)。如您所见,上面的模板上有一个5。这是因为它跳过了前5个字符,并将变量设置为下一个amount或1字符(我真的希望您能得到这个)。

因此,基本上,它将变量设置为不同(或相同)变量的较短值,该变量由偏移量和要包含在其中的字符数量决定。

我真的希望这样做

有人可以将这个可怜的人重定向到一个解释得更好的链接(我尝试过,确定!)?

  • 您对为何OPs代码不起作用的解释很好,尽管有点罗is。处理子字符串操作的其余部分与手头的问题无关。

 

 


从变量中提取路径的完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
set /p Fullpath="Specify full path:"
call :getPath %Fullpath% filename folder
echo %filename%
echo %folder%
pause
exit /b

:getPath
set"%2=%~nx1"
set"%3=%~dp1"
exit /b

这项工作是否可行:

1
2
SET VAR1=C:\\Folder1\\Folder2\\File.txt
echo %var1%

其中Echo是您的exe文件的名称。


 

 

出处:https://www.codenong.com/14848870/

posted on 2023-02-07 22:57  jack_Meng  阅读(1022)  评论(0编辑  收藏  举报

导航