首页 > 其他分享 >批处理怎样判断一个路径是文件还是文件夹

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

时间:2023-02-07 23:14:15浏览次数:28  
标签:文件 set 变量 批处理 路径 echo %% 文件夹 var

给定一个路径,批处理怎样判断它是个文件还是文件夹?
还有,如果我这样写:
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!

 

<iframe data-google-container-id="a!4" data-google-query-id="CNGjnaK2g_0CFVnjTAIdXPoKBQ" data-load-complete="true" frameborder="0" height="0" id="aswift_3" marginheight="0" marginwidth="0" name="aswift_3" scrolling="no" src="https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-1776224780566592&output=html&h=280&slotname=9509745083&adk=308819333&adf=2794636717&pi=t.ma~as.9509745083&w=748&fwrn=4&fwrnh=100&lmt=1673335661&rafmt=1&format=748x280&url=https%3A%2F%2Fwww.codenong.com%2F14848870%2F&fwr=0&fwrattr=true&rpe=1&resp_fmts=3&wgl=1&uach=WyJXaW5kb3dzIiwiMTAuMC4wIiwieDg2IiwiIiwiMTAzLjAuNTA2MC41MyIsW10sZmFsc2UsbnVsbCwiNjQiLFtbIi5Ob3QvQSlCcmFuZCIsIjk5LjAuMC4wIl0sWyJHb29nbGUgQ2hyb21lIiwiMTAzLjAuNTA2MC41MyJdLFsiQ2hyb21pdW0iLCIxMDMuMC41MDYwLjUzIl1dLGZhbHNlXQ..&dt=1675773355864&bpp=1&bdt=1160&idt=11209&shv=r20230202&mjsv=m202301250101&ptt=9&saldr=aa&abxe=1&prev_fmts=0x0%2C748x280%2C748x187&nras=1&correlator=2371260547369&frm=20&pv=1&ga_vid=1803751814.1675773367&ga_sid=1675773367&ga_hid=1678551388&ga_fc=0&u_tz=480&u_his=1&u_h=1080&u_w=1920&u_ah=1040&u_aw=1920&u_cd=24&u_sd=1&dmc=8&adx=428&ady=3166&biw=1903&bih=937&scr_x=0&scr_y=400&eid=44759875%2C44759926%2C44759837%2C31071887%2C44779793&oid=2&pvsid=3473781284963703&tmod=965659996&uas=0&nvt=1&ref=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dnn4_Pa4iba98So31uXAAPgcfB3DAX_tnNwmmbY4_gEvmZtnEs2jkIcPtM0-zSPf7%26wd%3D%26eqid%3D80d012770005b8710000000463e245a3&eae=0&fc=1920&brdim=0%2C0%2C0%2C0%2C1920%2C0%2C1920%2C1040%2C1920%2C937&vis=1&rsz=%7C%7CEebr%7C&abl=CS&pfx=0&fu=128&bc=31&ifi=4&uci=a!4&btvi=1&fsb=1&xpc=BlRDJ5Vsxh&p=https%3A//www.codenong.com&dtd=11212" style="left: 0; position: absolute; top: 0; border: 0; width: 748px; height: 0" width="748"></iframe>

 

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

首先,请注意没有/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/

标签:文件,set,变量,批处理,路径,echo,%%,文件夹,var
From: https://www.cnblogs.com/mq0036/p/17100103.html

相关文章

  • 在批处理下获取所有参数
    REM传递参数给append_log.bat时,如果参数有空格,要用单引号把参数包括起来,在目标程序用%*获取所有参数start/min"append_log"append_log.bat'开始运行%APP_NAME%' ......
  • 2019年ICPC南昌网络赛 J. Distance on the tree(树链剖分+主席树 查询路径边权第k大)
    DSM(DataStructureMaster)oncelearnedabouttreewhenhewaspreparingforNOIP(NationalOlympiadinInformaticsinProvinces)inSeniorHighSchool.Sowhen......
  • 如何在 C# 项目中链接一个文件夹下的所有文件
    在C#项目中通过链接方式引入文件可以让我们在项目中使用这些文件中的代码。常见的比如链接AssemblyInfo.cs文件,这样我们就可以在项目中使用这个文件中的版本号等信息......
  • django1.4设置模板路径和CSS,JS,image等路径的方法
    对于DJANGO这类MVC框架来说,路径问题可以称为一个谜一样的东西,很多人因为对路径不知道如何处理而觉得MVC实在是云里雾里不知所云。本文主要解决django中关于模板路径设置、CS......
  • java 最短路径算法
    packageorg.iaiai.suanfa;importjava.util.ArrayList;/****<p>*Title:Dijkstra.java*</p>*<p>*Http:iaiai.iteye.com*</p>*<p>*Createtime:2011-8-......
  • vscode代码片段输出两个斜杠\\ Windows 路径
    VScode代码片段中输出\\ ,一般常用于Windows路径,斜杠是转义符,想输出就要两个转义符 双引号版,引号需要转义:代码片段(两个斜杠):"path_str=\"\\\"", 效果:......
  • 如何在 C# 项目中链接一个文件夹下的所有文件
    在C#项目中通过链接方式引入文件可以让我们在项目中使用这些文件中的代码。常见的比如链接AssemblyInfo.cs文件,这样我们就可以在项目中使用这个文件中的版本号等信息。......
  • vue3配置@文件系统路径
    1、问题:在项目中引用通常是相对路径,在复用代码模块的时候,没注意就很容易路径出错2、方案:通过vite设置resolve.alias来配置文件系统路径,在文件中就可以使用配置的路径,移动......
  • centos查找已安装的jdk路径的方法
    在可执行java命令的情况下查找过程如下:执行whichjava[root@localhost~]#whichjava/usr/bin/java执行ls-lrt/usr/bin/java[root@localhost~]#ls-lr......
  • 对文件夹下所有的文件一键改名
    背景在下云盘课程时,发现很多课程后缀都会加一些特殊标志,感觉很影响结构化的观感,同时如果资料有代码的话,这种标识也会影响代码直接打开。因此做了一个简单的一键遍历程序,并打......