Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 检查目录中是否有任何文件夹_Windows_Batch File_Cmd - Fatal编程技术网

Windows 检查目录中是否有任何文件夹

Windows 检查目录中是否有任何文件夹,windows,batch-file,cmd,Windows,Batch File,Cmd,CMD。如何检查目录是否包含文件夹(未指定名称)?其他文件将被忽略 如果这是任何.txt文件的情况,它看起来会像这样: 如果存在*.txt 如何使用“any”文件夹?DIR“your directory”/ad,例如dirc:\Users/ad会显示C:\Users中的所有文件夹 Displays a list of files and subdirectories in a directory. DIR [ drive:][path][filename] [/A[[:]attribu

CMD。如何检查目录是否包含文件夹(未指定名称)?其他文件将被忽略

如果这是任何.txt文件的情况,它看起来会像这样:

如果存在*.txt

如何使用“any”文件夹?

DIR“your directory”/ad
,例如
dirc:\Users/ad
会显示C:\Users中的所有文件夹



 Displays a list of files and subdirectories in a directory.

 DIR [ drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
          Specifies drive, directory, and/or files to list.

  /A          Displays files with specified attributes.
  attributes   D  Directories                R  Read-only files
           H  Hidden files               A  Files ready for archiving
           S  System files               I  Not content indexed files
           L  Reparse Points         

您可以使用
find
命令

例如:

find <starting_search_directory> -type d -name "*folder_2020*" -print
find-键入d-名称“*文件夹_2020*”-打印

如果您只想使用cmd.exe shell控制台查看是否有任何目录,它将从
开始搜索目录
中递归查找目录名中包含“folder\u 2020”的所有目录(
-type d
):

DIR /A:D
如果要在.bat文件脚本中检查它:

SET "HASDIR=false"
FOR /F "eol=| delims=" %%A IN ('DIR /B /A:D') DO (SET "HASDIR=true")
IF /I "%HASDIR%" == "true" (
    REM Do things about the directories.
)
ECHO HASDIR is %HASDIR%

有多种解决方案可以检查目录是否包含子目录

在下面的所有解决方案中,以
%TEMP%
引用的临时文件文件夹为例


解决方案1使用FOR/D

@echo off
set "FolderCount=0"
for /D %%I in ("%TEMP%\*") do set /A FolderCount+=1
if %FolderCount% == 0 (
    echo Temporary files folder has no non-hidden subfolder.
) else if %FolderCount% == 1 (
    echo Temporary files folder has one non-hidden subfolder.
) else (
    echo Temporary files folder has %FolderCount% non-hidden subfolders.
)
pause
@echo off
set "FolderCount=0"
for /F "eol=| delims=" %%I in ('dir "%TEMP%" /AD /B 2^>nul') do set /A FolderCount+=1
if %FolderCount% == 0 (
    echo Temporary files folder has no subfolder.
) else if %FolderCount% == 1 (
    echo Temporary files folder has one subfolder.
) else (
    echo Temporary files folder has %FolderCount% subfolders.
)
pause
@echo off
dir "%TEMP%" /AD /B 2>nul | %SystemRoot%\System32\findstr.exe /R "^." >nul
if errorlevel 1 (
    echo Temporary files folder has no subfolder.
) else (
    echo Temporary files folder has subfolders.
)
pause
此解决方案的问题是FOR使用选项
/D
在指定目录中搜索与通配符模式匹配的目录以查找临时文件时会忽略具有隐藏属性集的目录。因此,对于具有隐藏属性集的目录,不执行命令SET,该命令使用算术表达式将每个目录上的环境变量
FolderCount
的值增加1

此解决方案的简短版本(不包括文件夹):

@echo off
for /D %%I in ("%TEMP%\*") do goto HasFolders
echo Temporary files folder has no non-hidden subfolder.
goto EndBatch

:HasFolders
echo Temporary files folder has non-hidden subfolders.

:EndBatch
pause
@echo off
for /F "eol=| delims=" %%I in ('dir "%TEMP%" /AD /B 2^>nul') do goto HasFolders
echo Temporary files folder has no subfolder.
goto EndBatch

:HasFolders
echo Temporary files folder has subfolders.

:EndBatch
pause
使用上的GOTO命令退出循环,因为已将非隐藏目录的名字指定给循环变量


解决方案2使用FOR/FDIR

@echo off
set "FolderCount=0"
for /D %%I in ("%TEMP%\*") do set /A FolderCount+=1
if %FolderCount% == 0 (
    echo Temporary files folder has no non-hidden subfolder.
) else if %FolderCount% == 1 (
    echo Temporary files folder has one non-hidden subfolder.
) else (
    echo Temporary files folder has %FolderCount% non-hidden subfolders.
)
pause
@echo off
set "FolderCount=0"
for /F "eol=| delims=" %%I in ('dir "%TEMP%" /AD /B 2^>nul') do set /A FolderCount+=1
if %FolderCount% == 0 (
    echo Temporary files folder has no subfolder.
) else if %FolderCount% == 1 (
    echo Temporary files folder has one subfolder.
) else (
    echo Temporary files folder has %FolderCount% subfolders.
)
pause
@echo off
dir "%TEMP%" /AD /B 2>nul | %SystemRoot%\System32\findstr.exe /R "^." >nul
if errorlevel 1 (
    echo Temporary files folder has no subfolder.
) else (
    echo Temporary files folder has subfolders.
)
pause
FOR带有选项
/F
和一个包含在
'
中的集合,将在后台启动另一个命令进程,并附加
%ComSpec%/c
'
中的命令行作为附加参数。安装到
C:\Windows
的Windows也会这样执行:

C:\Windows\System32\cmd.exe /c dir "C:\Users\UserName\AppData\Local\Temp" /AD /B 2>nul
DIR由后台命令进程搜索执行

  • 在临时文件的指定目录中
  • 仅适用于目录,因为选项
    /AD
    (属性目录)
  • 由于选项
    /AD
    还包括设置了隐藏属性的目录,因此会覆盖默认的
    /A-H
    (除属性隐藏外的所有属性)
  • 并以裸格式输出它们,因为选项
    /B
    ,这会导致忽略标准目录
    (当前目录)和
    (父目录),只打印目录名而不打印路径
写入DIR的输出以处理启动的后台命令进程的STDOUT(标准输出)。如果指定目录中没有子目录,则不会输出任何内容

如果指定的目录根本不存在,则会有一条错误消息输出,用于处理后台命令进程的STDERR(标准错误)。此错误消息将由执行批处理文件的命令进程重定向到ownSTDERRhandle,并在控制台窗口中输出。因此,
2>nul
被附加到DIR命令行,通过将错误消息从句柄STDERR重定向到设备nul来抑制后台命令过程中的错误消息

阅读Microsoft关于的文章,了解有关
2>nul
的解释。当Windows命令解释器在执行FOR的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

FORwith option
/F
捕获写入已启动后台命令进程的STDOUT的输出,并在启动
cmd.exe
后逐行处理输出,在完成内部命令DIR后终止自身

默认情况下,会忽略此处不出现的的空行

FOR默认情况下将使用普通空格和水平制表符作为字符串分隔符将行拆分为子字符串,并仅将第一个空格/制表符分隔的字符串分配给指定的循环变量
I
。此行拆分行为在这里是不必要的,因此使用选项
delims=
将其禁用,该选项定义了一个空的字符串分隔符列表

FOR也将忽略将一行拆分为子字符串后的第一个子字符串以默认的行尾字符开始的行。行拆分行为已被禁用,但目录名可以以分号开头。对于,这样的目录名将被忽略。因此,
eol=|
选项将竖线定义为任何目录名称都不能具有的行尾字符,因此对于,不会忽略任何目录。另请参见Microsoft文档页面

分配给循环变量
I
的目录名实际上没有被使用,因为FOR只对每个目录名执行命令SET,并使用算术表达式将环境变量
FolderCount
的值增加1

环境变量
FolderCount
包含su的数量