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."
)