使用 BATCH 脚本检查目录中是不是存在任何类型的文件
Posted
技术标签:
【中文标题】使用 BATCH 脚本检查目录中是不是存在任何类型的文件【英文标题】:Check if any type of files exist in a directory using BATCH script使用 BATCH 脚本检查目录中是否存在任何类型的文件 【发布时间】:2012-06-04 13:11:57 【问题描述】:您好,我正在寻找一个批处理文件来检查给定文件夹中是否有任何类型的文件。
到目前为止,我已经尝试了以下方法
if EXIST FOLDERNAME\\*.* ( echo Files Exist ) ELSE ( echo "Empty" )
如果我知道文件扩展名(例如 txt 文件),我可以让它工作
if EXIST FOLDERNAME\\*.txt ( echo Files Exist ) ELSE ( echo "Empty" )
感谢您的帮助
【问题讨论】:
Batch script: Search if a folder contains any files 的可能重复项 【参考方案1】:检查一个文件夹是否包含至少一个文件
>nul 2>nul dir /a-d "folderName\*" && (echo Files exist) || (echo No file found)
检查一个文件夹或其任何后代是否包含至少一个文件
>nul 2>nul dir /a-d /s "folderName\*" && (echo Files exist) || (echo No file found)
检查文件夹是否包含至少一个文件或文件夹。注意添加/a
选项以启用隐藏和系统文件/文件夹的查找。
dir /b /a "folderName\*" | >nul findstr "^" && (echo Files and/or Folders exist) || (echo No File or Folder found)
检查一个文件夹是否至少包含一个文件夹
dir /b /ad "folderName\*" | >nul findstr "^" && (echo Folders exist) || (echo No folder found)
【讨论】:
这是什么巫术??! 为什么将重定向放在命令之前?>nul 2>nul command
和 command >nul 2>nul
有区别吗?
@kitcar2000 - 没有任何区别。重定向可以出现在命令的开头、结尾,甚至是中间!
@kitcar2000 可能存在细微的差异,具体取决于命令。例如,>file echo 1 2
将发送 1 2
和一个 CR-LF 到 file
。 echo 1 2>file
不会,因为2>
被视为“重定向标准错误”,而echo 1 2 >file
将“工作”,但会添加一个可能不需要的空间。
效果很好。我把结尾改成... && (SET FOUND_FILE=1) || (SET FOUND_FILE=0) 所以我可以稍后在 IF 语句中使用它【参考方案2】:
对于目录中的文件,您可以使用以下内容:
if exist *.csv echo "csv file found"
或
if not exist *.csv goto nofile
【讨论】:
这只有在文件类型的子集非常有限时才有用;你肯定知道;你知道那些是什么。这是一个非常有限的解决方案。.csv
的扩展名并不能保证该条目是文件。没有什么可以阻止您使用 .csv
或任何其他扩展名创建目录。
OP 明确声明他们不想测试特定的扩展名,而是测试 any 文件。【参考方案3】:
你可以用这个
@echo off
for /F %%i in ('dir /b "c:\test directory\*.*"') do (
echo Folder is NON empty
goto :EOF
)
echo Folder is empty or does not exist
取自here。
这应该可以满足您的需要。
【讨论】:
【参考方案4】:一个滚动你自己的功能。
通过2nd
开关支持或不支持递归。
此外,允许使用 ;
的文件名称,尽管这是一个很好的答案,但已接受的答案未能解决,这将解决该问题。
这个想法来自https://ss64.com/nt/empty.html
代码中的注释。
@echo off
title %~nx0
setlocal EnableDelayedExpansion
set dir=C:\Users\%username%\Desktop
title Echos folders and files in root directory...
call :FOLDER_FILE_CNT dir TRUE
echo !dir!
echo/ & pause & cls
::
:: FOLDER_FILE_CNT function by Ste
::
:: First Written: 2020.01.26
:: Posted on the thread here: https://***.com/q/10813943/8262102
:: Based on: https://ss64.com/nt/empty.html
::
:: Notes are that !%~1! will expand to the returned variable.
:: Syntax call: call :FOLDER_FILE_CNT "<path>" <BOOLEAN>
:: "<path>" = Your path wrapped in quotes.
:: <BOOLEAN> = Count files in sub directories (TRUE) or not (FALSE).
:: Returns a variable with a value of:
:: FALSE = if directory doesn't exist.
:: 0-inf = if there are files within the directory.
::
:FOLDER_FILE_CNT
if "%~1"=="" (
echo Use this syntax: & echo call :FOLDER_FILE_CNT "<path>" ^<BOOLEAN^> & echo/ & goto :eof
) else if not "%~1"=="" (
set count=0 & set msg= & set dirExists=
if not exist "!%~1!" (set msg=FALSE)
if exist "!%~1!" (
if %~2==TRUE (
>nul 2>nul dir /a-d /s "!%~1!\*" && (for /f "delims=;" %%A in ('dir "!%~1!" /a-d /b /s') do (set /a count+=1)) || (set /a count+=0)
set msg=!count!
)
if %~2==FALSE (
for /f "delims=;" %%A in ('dir "!%~1!" /a-d /b') do (set /a count+=1)
set msg=!count!
)
)
)
set "%~1=!msg!" & goto :eof
)
【讨论】:
当%~1
有空格时,if %~1==
将失败。更好地使用引号:if "%~1"==""
以避免语法错误。
当文件以分号 ; Semi.txt
开头时失败,它也计算目录而不仅仅是文件
已修复。 接受的答案在文件开头包含;
时也会出现问题。如何解决这个问题?在这种情况下,dir
命令甚至没有列出文件。
修复了这个问题。答案的历史将显示修复。感谢您指出这一点。
我不明白为什么 dbenham 的回答应该有任何问题,因为问题只发生在 FOR /F
上。顺便提一句。我不明白你的东西>nul 2>nul dir /a-d "!%~1!\*" &&
现在当基目录中至少有一个文件时,你只计算子目录中的文件。为什么需要|| set /a count+0
?以上是关于使用 BATCH 脚本检查目录中是不是存在任何类型的文件的主要内容,如果未能解决你的问题,请参考以下文章