For loop 是否将%1作为目录在批处理中循环?

For loop 是否将%1作为目录在批处理中循环?,for-loop,batch-file,input,For Loop,Batch File,Input,我在网上搜索过答案,但似乎找不到答案。我希望用户提供一个目录,并能够循环通过它。我可以循环浏览当前目录,如下所示: @Echo off for /r %%f in (*.*) do ( echo %%f ) 但是,当我尝试通过循环%1来执行同样的操作时,我无法得到我想要的结果。我做错了什么?以下是我在批处理文件中的位置: @Echo off if exist %1 ( for /r %%f in (%1) do ( echo %%f )

我在网上搜索过答案,但似乎找不到答案。我希望用户提供一个目录,并能够循环通过它。我可以循环浏览当前目录,如下所示:

@Echo off
for /r %%f in (*.*) do (
    echo    %%f
)
但是,当我尝试通过循环%1来执行同样的操作时,我无法得到我想要的结果。我做错了什么?以下是我在批处理文件中的位置:

@Echo off

if exist %1 (
    for /r %%f in (%1) do (
        echo    %%f
    )

) else (
    echo "That directory does not exist."
)
我尝试过使用
/D
,但所做的只是像这样回显我提供的目录:

FileCount C:\Users\Me\Desktop
> C:\Users\Me\Desktop
编辑:我的目标是最终统计给定目录中的文件数。我希望提供的目录是绝对路径,我将通过cmd执行此文件。下面是一个我期待的输入示例

FileCount C:\Users\Me\Desktop
所需的输出类似于:

> Hello world.txt
> Cat.png
> There are 2 files within this directory.

旁注:我不想过滤掉dir命令的输出,我想用for循环来实现这一点。

这是您要求的,再加上可选的递归功能。请注意,这将丢失隐藏的文件和目录

@setlocal EnableExtensions
@prompt=$G

@set _Error_Success=0
@set _Error_PathNotFound=3

@if "%~1" equ "/?" goto :Usage
@if "%~1" equ "" goto :Usage
@if "%~1" equ "/r" (@set _recurs=/r & @set _root=%~2) else (@set _root=%~1)
@if not exist "%_root%" goto :Oops

@set count=0

@pushd "%_root%"
@for %_recurs% %%f in (*) do @call :Counter "%%f"
@popd

@echo There are %count% entries within this directory.
@exit /b %_Error_Success%

:Counter
@set /a count+=1
@echo %~1
@exit /b %_Error_Success%

:Oops
@echo "That directory does not exist."
@exit /b %_Error_PathNotFound%

:Usage
@echo Usage: FileCount [/r] path
这将使用dir命令,而无需调用findstr:

@setlocal EnableExtensions
@prompt=$G

@set _Error_Success=0
@set _Error_PathNotFound=3
@set _Error_InvalidParameter=87

@set _attributes=
@set _recurs=
@set _count=0

@if "%~1" equ "/?" @goto :Usage & @exit
@if "%~1" equ "" goto :Usage

@set _root=%~1
@if not exist "%_root%" goto :Oops

@shift

@pushd "%_root%"
for /f %%G in ('dir /B /A-d %1 %2 %_root%') do @call :Counter "%%G"
@popd

@echo There are %_count% entries within this directory.
@exit /b %_Error_Success%

:Counter
@set /a _count+=1
@echo %~1
@exit /b %_Error_Success%

:HandleOptions

:Oops
@echo "That directory does not exist."
@exit /b %_Error_PathNotFound%

:Usage
@echo Usage: FileCount [/A<Attributes>] [/S] rootPath
@echo   Where <Attributes> corresponds to 'dir /A' optiions (see 'help dir')
@echo   and /S will cause recursion into subdirectories of rootPath.
@setlocal EnableExtensions
@prompt=$G
@设置_错误_成功=0
@设置_错误_路径未找到=3
@设置错误无效参数=87
@设置属性=
@集合递归=
@设置_计数=0
@如果“%~1”eq“/?@goto:用法和退出
@如果“%~1”eq“转到:用法
@集合_根=%~1
@如果不存在“%\u root%”转到:Oops
@移位
@pushd“%\u根%”
对于/f%%G in('dir/B/A-d%1%2%\u root%'),执行@call:Counter“%%G”
@流行音乐
@echo此目录中有%\u count%个条目。
@退出/b%\u错误\u成功%
:计数器
@设置/a_计数+=1
@回声%1
@退出/b%\u错误\u成功%
:手语
:哎呀
@echo“该目录不存在。”
@退出/b%\u错误\u路径未找到%
:用法
@回显用法:FileCount[/A][/S]根路径
@对应于“目录/A”选项的回显(请参阅“帮助目录”)
@echo和/S将导致递归到rootPath的子目录中。

本例使用
进行
循环,根据您的莫名其妙的请求,不使用
dir
命令,而是使用
xcopy
列出并计算其中的文件:

@对于(“%1”)中的%%G,执行@If“%%~aG”Lss“d”(If“%%~aG”GEq“-”(
回显错误:给定文件参数,应为目录。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B 1)其他(
回显错误:参数无效,应为目录路径。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B(1)
)Else回显“%$1”的文件内容:&For/F Delims^=%%H In(
“%SystemRoot%\System32\xcopy.exe”%~1:“/HIL”)Do@Echo%%~nsh
@%SystemRoot%\System32\timeout.exe/T-1&退出/B 0

如果您希望它递归输入目录,那么我建议进行以下非常小的修改:

@对于(“%1”)中的%%G,执行@If“%%~aG”Lss“d”(If“%%~aG”GEq“-”(
回显错误:给定文件参数,应为目录。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B 1)其他(
回显错误:参数无效,应为目录路径。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B(1)
)Else回显“%$1”的文件内容:&For/F Delims^=%%H In(
“%SystemRoot%\System32\xcopy.exe”%~1:“/HILS”)Do@Echo%%H
@%SystemRoot%\System32\timeout.exe/T-1&退出/B 0
或者多做一点工作,输出相对路径:

@对于(“%1”)中的%%G,执行@If“%%~aG”Lss“d”(If“%%~aG”GEq“-”(
回显错误:给定文件参数,应为目录。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B 1)其他(
回显错误:参数无效,应为目录路径。
%SystemRoot%\System32\timeout.exe/t3/NoBreak 1>numl
退出/B(1)
)Else回显“%$1”的文件内容:&For/F Delims^=%%H In(
“%SystemRoot%\System32\xcopy.exe”%~1:“/HILS”)是否执行@(
Set“}=%%H”&SetLocal EnableDelayedExpansion
对于(“!}:%%1=。!”)中的%%I,执行@EndLocal和Echo%%~I)
@%SystemRoot%\System32\timeout.exe/T-1&退出/B 0
如果需要递归,请将其命名为
progname.bat/r[foldname]

setlocal enabledelayedexpansion
rem Put it into a folder that is in ENV PATH variable.
rem So, you can call it from wherever you want.

if "%1"=="/r" shift

if not "%1"=="" (
    if exist "%~dpn1" (


        set /a "filecount=0"
        set /a "totalcount=0"
        set "oldroot=%~dpn1"

        for /f "tokens=* delims=" %%f in ('dir /b /s "!cd!"') do (

            if not "%%~dpf"=="!oldroot!" (
                echo:
                echo In "!oldroot!" found !filecount! file^(s^).
                echo:
                set /a "filecount=0"
                set "oldroot=%%~dpf"
            )
            echo  ---   %%f
            set /a "filecount+=1"
            set /a "totalcount+=1"
        )
        echo:
        echo In "%~dpn1" found !totalcount! file^(s^).

    ) else (
        echo:
        echo [ERROR] Invalid input. Please specify:
        echo    1. A full path.
        echo    2. A folder in cwd.
        echo:
        echo If input is empty, current working directory (cwd)
        echo will be considered.
        exit /b 1
    )
) else (
    
    set /a "filecount=0"
    set /a "totalcount=0"
    set "oldroot=!cd!"

    for /f "tokens=* delims=" %%f in ('dir /b /s "!cd!"') do (

        if not "%%~dpf"=="!oldroot!" (
            echo:
            echo In "!oldroot!" found !filecount! file^(s^).
            echo:
            set /a "filecount=0"
            set "oldroot=%%~dpf"
        )
        echo  ---   %%f
        set /a "filecount+=1"
        set /a "totalcount+=1"
    )
    echo:
    echo In "%~dp0" found !totalcount! file^(s^).

)


endlocal

试试看它是否符合您的期望。

谢谢大家的帮助,我已经找到了解决问题的方法,非常简单。我所需要做的就是循环使用
%1\*.
,而不是
%1
本身

@Echo off

if exist %1 (
    for %%f in (%1\*.*) do (
        echo    %%f
    )

) else (
    echo "That directory does not exist."
)

你能提供更多关于这项任务的信息吗。您希望输入是什么,仅为目录名、绝对路径还是相对路径。如何提供输入参数、命令提示符、Windows资源管理器或通过另一个运行的可执行文件?在批处理文件中执行任务的方法有很多,但是有了这些信息,一个集中的、健壮的和/或高效的解决方案会简单得多。请提供这些信息,不要发表评论!欢迎来到SO。请获取并读取。是否希望它在指定目录下递归?你搜索了吗?我同意@jwdonahue的说法,
dir
命令也是列出并计算文件的正确命令,(如果在命令提示下使用
dir
,您将在输出中清楚地看到文件名和文件计数。由于您的最终目标是检索该信息,因此在一开始使用它似乎更有效)。另外,
for
for/d
for/r
不会获取所有文件和/或目录,而
dir
提供了这样做的选项!如果您不希望它递归,为什么选择使用
/r
选项?
@Echo off

if exist %1 (
    for %%f in (%1\*.*) do (
        echo    %%f
    )

) else (
    echo "That directory does not exist."
)