2013-03-05 133 views
1

以下代码对包含感叹号的文件夹名称失败。我想我需要启用DelayedExpansion来处理嵌套for循环。任何想法得到这项工作?谢谢!cmd和感叹号

@echo off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 

set "dest=%~dpn1" 
IF "%1" equ "" Set "dest=%cd%" 

set /a Folders=0 
set /a FoldersWithSubFoldersAndFiles=0 
set /a FoldersWithOnlyFiles=0 
set /a FoldersWithOnlySubFolders=0 
set /a FoldersEmpty=0 

for /f "usebackq tokens=*" %%a in (`DIR /AD /S /B "%dest%"`) do (
    Set /a Folders+=1 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /A-D /B 2^>NUL^| FIND /C /V ""`) do (
     Set NumberOfFiles=%%i 
    ) 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /AD /B 2^>NUL^| FIND /C /V ""`) do (
     set NumberOfFolders=%%i 
    ) 
    IF "!NumberOfFiles!" neq "0" IF "!NumberOfFolders!" neq "0" set /a FoldersWithSubFoldersAndFiles+=1 
    IF "!NumberOfFiles!" neq "0" IF "!NumberOfFolders!" equ "0" set /a FoldersWithOnlyFiles+=1 
    IF "!NumberOfFiles!" equ "0" IF "!NumberOfFolders!" neq "0" set /a FoldersWithOnlySubFolders+=1 
    IF "!NumberOfFiles!" equ "0" IF "!NumberOfFolders!" equ "0" (
     set /a FoldersEmpty+=1 
     echo %%a is empty. 
    ) 
) 

echo Found %Folders% folders below "%dest%". 
echo %FoldersWithSubFoldersAndFiles% folders containing files and subfolders. 
echo %FoldersWithOnlyFiles% folders containing files only. 
echo %FoldersWithOnlySubFolders% folders containing subfolders only. 
echo %FoldersEmpty% folders are empty. 

endlocal 

回答

6

我看到3个简单的解决方案:

1)最慢的方法是使用CALL,这样你就不需要你的循环中延迟扩展。

@echo off & setlocal disableDelayedExpansion 

set "dest=%~dpn1" 
IF "%1" equ "" Set "dest=%cd%" 

set /a Folders=0 
set /a FoldersWithSubFoldersAndFiles=0 
set /a FoldersWithOnlyFiles=0 
set /a FoldersWithOnlySubFolders=0 
set /a FoldersEmpty=0 

for /f "usebackq tokens=*" %%a in (`DIR /AD /S /B "%dest%"`) do (
    Set /a Folders+=1 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /A-D /B 2^>NUL^| FIND /C /V ""`) do (
     Set NumberOfFiles=%%i 
    ) 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /AD /B 2^>NUL^| FIND /C /V ""`) do (
     set NumberOfFolders=%%i 
    ) 
    call :incrementCounts 
) 

echo Found %Folders% folders below "%dest%". 
echo %FoldersWithSubFoldersAndFiles% folders containing files and subfolders. 
echo %FoldersWithOnlyFiles% folders containing files only. 
echo %FoldersWithOnlySubFolders% folders containing subfolders only. 
echo %FoldersEmpty% folders are empty. 
echo See dircount.log for list of empty folders. 

endlocal 
exit /b 

:incrementCounts 
IF "%NumberOfFiles%" neq "0" IF "%NumberOfFolders%" neq "0" set /a FoldersWithSubFoldersAndFiles+=1 
IF "%NumberOfFiles%" neq "0" IF "%NumberOfFolders%" equ "0" set /a FoldersWithOnlyFiles+=1 
IF "%NumberOfFiles%" equ "0" IF "%NumberOfFolders%" neq "0" set /a FoldersWithOnlySubFolders+=1 
IF "%NumberOfFiles%" equ "0" IF "%NumberOfFolders%" equ "0" (
    set /a FoldersEmpty+=1 
    echo %%a is empty. 
) 
exit /b 

2)更快的方法是临时启用延迟扩展,只需将该值传递给FOR变量即可。

@echo off & setlocal disableDelayedExpansion 

set "dest=%~dpn1" 
IF "%1" equ "" Set "dest=%cd%" 

set /a Folders=0 
set /a FoldersWithSubFoldersAndFiles=0 
set /a FoldersWithOnlyFiles=0 
set /a FoldersWithOnlySubFolders=0 
set /a FoldersEmpty=0 

for /f "usebackq tokens=*" %%a in (`DIR /AD /S /B "%dest%"`) do (
    Set /a Folders+=1 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /A-D /B 2^>NUL^| FIND /C /V ""`) do (
     Set NumberOfFiles=%%i 
    ) 
    for /f "usebackq tokens=*" %%i in (`DIR "%%a" /AD /B 2^>NUL^| FIND /C /V ""`) do (
     set NumberOfFolders=%%i 
    ) 
    setlocal enableDelayedExpansion 
    for /f "tokens=1,2" %%N in ("!NumberOfFiles! !NumberOfFolders!") do (
     endlocal 
     IF "%%N" neq "0" IF "%%M" neq "0" set /a FoldersWithSubFoldersAndFiles+=1 
     IF "%%N" neq "0" IF "%%M" equ "0" set /a FoldersWithOnlyFiles+=1 
     IF "%%N" equ "0" IF "%%M" neq "0" set /a FoldersWithOnlySubFolders+=1 
     IF "%%N" equ "0" IF "%%M" equ "0" (
      set /a FoldersEmpty+=1 
      echo %%a is empty. 
     ) 
    ) 
) 

echo Found %Folders% folders below "%dest%". 
echo %FoldersWithSubFoldersAndFiles% folders containing files and subfolders. 
echo %FoldersWithOnlyFiles% folders containing files only. 
echo %FoldersWithOnlySubFolders% folders containing subfolders only. 
echo %FoldersEmpty% folders are empty. 
echo See dircount.log for list of empty folders. 

endlocal 

3)但我会处理它的方式是消除只在循环内使用的2个变量。它们不在循环外部使用,并且它们已经从FOR变量派生。由于所有东西现在都是FOR变量,所以不再需要延迟扩展。

@echo off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 

set "dest=%~dpn1" 
IF "%1" equ "" Set "dest=%cd%" 

set /a Folders=0 
set /a FoldersWithSubFoldersAndFiles=0 
set /a FoldersWithOnlyFiles=0 
set /a FoldersWithOnlySubFolders=0 
set /a FoldersEmpty=0 

for /f "usebackq tokens=*" %%a in (`DIR /AD /S /B "%dest%"`) do (
    Set /a Folders+=1 
    for /f "usebackq tokens=*" %%N in (`DIR "%%a" /A-D /B 2^>NUL^| FIND /C /V ""`) do (
     for /f "usebackq tokens=*" %%M in (`DIR "%%a" /AD /B 2^>NUL^| FIND /C /V ""`) do (
      IF "%%N" neq "0" IF "%%M" neq "0" set /a FoldersWithSubFoldersAndFiles+=1 
      IF "%%N" neq "0" IF "%%M" equ "0" set /a FoldersWithOnlyFiles+=1 
      IF "%%N" equ "0" IF "%%M" neq "0" set /a FoldersWithOnlySubFolders+=1 
      IF "%%N" equ "0" IF "%%M" equ "0" (
       set /a FoldersEmpty+=1 
       echo %%a is empty. 
      ) 
     ) 
    ) 
) 

echo Found %Folders% folders below "%dest%". 
echo %FoldersWithSubFoldersAndFiles% folders containing files and subfolders. 
echo %FoldersWithOnlyFiles% folders containing files only. 
echo %FoldersWithOnlySubFolders% folders containing subfolders only. 
echo %FoldersEmpty% folders are empty. 
echo See dircount.log for list of empty folders. 

endlocal 
+0

哎!非常感谢!我想我喜欢所有三种变体 - 并且再次了解到有关cmd特殊处理的知识:-)。但DelayedExpansion完全禁用:那么文件夹名称中的&符号是否不会破坏脚本?不过:我会试试看,明天再报告。已经从这里开始了晚上... Martin – CmdQuestion 2013-03-05 23:22:11

+0

@CmdQuestion - 文件或文件夹名称中的&符号不应该对任何选项造成任何问题。 – dbenham 2013-03-06 05:15:54

+0

作品!现在好的程序:-)马丁 – CmdQuestion 2013-03-07 16:10:29