所以,我有一个批处理,它通过文件系统运行,并检查其中文件的大小,如果大小为零字节,则使用不同的扩展名重命名它们。这部分很容易,但现在我必须检查当前正在查看的是文件还是文件夹。
这是我到目前为止的代码。
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:UsersnmavisDesktopgndjufsb"
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 %%~sgNUL (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
但是,每当我运行它时,无论它是文件还是文件夹,它都会显示"文件"
经过一番搜索,我通过更改此行来解决问题:
for /f %%g in ('dir /b %FTPFOLDER%%~1') do (if exist %%~sgNUL (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"))
这不仅决定了它是否是文件夹或文件,而且无论您有多少文件深度,它都会正确地在文件系统中更深入。