【问题标题】:Differentiating between Files and Folders in batch [duplicate]批量区分文件和文件夹[重复]
【发布时间】:2016-07-14 16:34:20
【问题描述】:

所以,我有一个批处理通过文件系统运行,并检查其中文件的大小,如果大小为零字节,则使用不同的扩展名重命名它们。这部分很简单,但现在我必须检查当前正在查看的是文件还是文件夹。

到目前为止,这是我的代码。

SET FTPFOLDER="C:\temp"

rem this goes thru a folder system.
for /f %%f in ('dir /b %FTPFOLDER%') do (call :Search "%%f") 
EXIT /B 0


REM GOES THRU EACH OF THE FILES IN EACH OF THE FOLDERS
:Search
for /f %%g in ('dir /b %FTPFOLDER%\%~1') do(call :checkType "%%g", "%FTPFOLDER%\%~1\%%g\", %%~ng  )
pause
EXIT /B 0

:checkType
if exists %~1\* (call :Search %~1) else (call :checkSize %~2, %~3)
EXIT /B 0

REM CHECKS IF ZERO 
:checkSize
set file=%~1
@echo %file%
for /f "usebackq" %%h in ('%file%') do set size=%%~zh
if %size% EQU 0 (call :Rename "%file%", %~2)
EXIT /B 0

REM - RENAMES FILE TO .EMPTY
:Rename
ren %~1 %~2.empty 
EXIT /B 0

到目前为止,我尝试过的任何方法都没有奏效。我对批处理非常陌生,因此我们将不胜感激,尤其是在解释方面。

编辑:我觉得提到文件名或文件夹名都不会有空格也很重要。

编辑:我已更改代码以删除额外的功能,并在 for 循环中执行此操作。我的新代码如下

SET FTPFOLDER="C:\Users\nmavis\Desktop\gndjufsb"

rem this goes thru a folder system. 
for /f %%f in ('dir /b %FTPFOLDER%') do (call :Search "%%f") 
EXIT /B 0

REM GOES THRU EACH OF THE FILES IN EACH OF THE FOLDERS
:Search
for /f %%g in ('dir /b %FTPFOLDER%\%~1') do (if exist %%~sg\NUL (echo dir) else (echo file))
pause
EXIT /B 0

REM CHECKS IF ZERO 
:checkSize
set file=%~1
@echo %file%
for /f "usebackq" %%h in ('%file%') do set size=%%~zh
if %size% EQU 0 (call :Rename "%file%", %~2)
EXIT /B 0

REM - RENAMES FILE TO .EMPTY
:Rename
ren %~1 %~2.empty 
EXIT /B 0

但是,每当我运行它时,无论是文件还是文件夹,它都会显示“文件”

【问题讨论】:

  • 输入dir /?;你会发现一个开关/A 允许过滤目录/A:D 或文件/A:-D...
  • 你能澄清你的意思吗?就像我应该在代码中的哪个位置执行此操作,它到底是什么意思?
  • 对不起,我认为dir /A 不适用于您,因为您尝试区分:checkType 中的文件和文件夹而不是更早,所以我将删除我的相关评论...但是如果对您有帮助,请告诉我:我的意思是:dir /A:D 仅返回目录,而 dir /A:-D 仅返回文件; dir 没有这些过滤器选项返回...
  • 我正要说for %%I in ("%file%") do if exist %%~sI\NUL echo directory。看起来这已经是 aschipfl 链接的问题中公认的答案。
  • @rojo,一个普通的for 应该只在它访问文件系统的情况下返回文件(所以当使用通配符时),除非提供了/D,在这种情况下目录是仅枚举...

标签: file batch-file


【解决方案1】:

经过一番搜索,我通过更改此行来解决问题:

for /f %%g in ('dir /b %FTPFOLDER%\%~1') do (if exist %%~sg\NUL (echo dir) else (echo file))

到这里:

for /f %%g in ('dir /b %FTPFOLDER%\%~1') do (if exist %FTPFOLDER%\%~1\%%g\* (call :Search "%~1\%%g")  else (call :checkSize "%FTPFOLDER%\%~1\%%g", "%%~ng"))

它不仅确定它是文件夹还是文件,而且无论你有多少文件,它都会正确地在文件系统中更深一层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2017-12-10
    相关资源
    最近更新 更多