Batch file 为什么';我的批处理找不到列出子文件夹文件的路径?

Batch file 为什么';我的批处理找不到列出子文件夹文件的路径?,batch-file,Batch File,我一直在想为什么%%dp0 plus%%我似乎不在嵌套的for中工作 REM for each folder for /f "tokens=*" %%I in ('dir /ad /b "%~dp0\*.*"') do ( ECHO. >> "%~dp0\_list of files with extension_.txt" ECHO. -------- %%I -------- >> "%~dp0\_list of files with extension_.txt"

我一直在想为什么%%dp0 plus%%我似乎不在嵌套的for中工作

REM for each folder
for /f "tokens=*" %%I in ('dir /ad /b "%~dp0\*.*"') do (
ECHO. >> "%~dp0\_list of files with extension_.txt"
ECHO. -------- %%I  -------- >> "%~dp0\_list of files with extension_.txt"
ECHO. >> "%~dp0\_list of files with extension_.txt"

REM for each file in that folder
REM in line below, the path of %~dp0 plus %%I does not seem to get used???
for /R "%~dp0%%I" %%f in (*.*) do (
echo %%~nf%%~xf >> "%~dp0\_list of files with extension_.txt"
)

ECHO. >> "%~dp0\_list of files with extension_.txt"
)
如果我在第二个之前做了一个ECHO%%dp0或ECHO%%I,看起来不错,但它似乎没有走这条路,你知道为什么吗

我今天得到的结果是

------ Folder1 name ------

------ Folder2 name ------
我想要的预期输出是这样的

------ Folder1 name ------
file1.txt
file2.txt
file3.txt

------ Folder2 name ------
file1.txt
file2.txt

for/f
命令的“选项”部分或
for/r
的起始路径中,您不能使用延迟扩展或
for
可替换参数。这些元素在参数展开的
delayedexpansion
之前被解析

但您可以通过更改当前活动文件夹并从那里进行迭代来解决此问题

@echo关闭
setlocal enableextensions disabledelayedexpansion
(
对于“%~dp0\*”中的/d%%d,请执行以下操作(
pushd“%%~fD”
回声(-----%%~nxD--------
对于(*)中的/r%%F,执行回显(%%~nxF)
回音(
邻苯二胺
)
)>>“%~dp0\\扩展名为\.txt的文件列表”

您不能在
for/f
命令的“选项”部分或
for/r
的起始路径中使用延迟扩展或
for
可替换参数。这些元素是在
延迟扩展
for
参数扩展发生之前解析的

但您可以通过更改当前活动文件夹并从那里进行迭代来解决此问题

@echo关闭
setlocal enableextensions disabledelayedexpansion
(
对于“%~dp0\*”中的/d%%d,请执行以下操作(
pushd“%%~fD”
回声(-----%%~nxD--------
对于(*)中的/r%%F,执行回显(%%~nxF)
回音(
邻苯二胺
)
)>>“%~dp0\\扩展名为\.txt的文件列表”

您不能在
for/f
命令的“选项”部分或
for/r
的起始路径中使用延迟扩展或
for
可替换参数。这些元素是在
延迟扩展
for
参数扩展发生之前解析的

但您可以通过更改当前活动文件夹并从那里进行迭代来解决此问题

@echo关闭
setlocal enableextensions disabledelayedexpansion
(
对于“%~dp0\*”中的/d%%d,请执行以下操作(
pushd“%%~fD”
回声(-----%%~nxD--------
对于(*)中的/r%%F,执行回显(%%~nxF)
回音(
邻苯二胺
)
)>>“%~dp0\\扩展名为\.txt的文件列表”

您不能在
for/f
命令的“选项”部分或
for/r
的起始路径中使用延迟扩展或
for
可替换参数。这些元素是在
延迟扩展
for
参数扩展发生之前解析的

但您可以通过更改当前活动文件夹并从那里进行迭代来解决此问题

@echo关闭
setlocal enableextensions disabledelayedexpansion
(
对于“%~dp0\*”中的/d%%d,请执行以下操作(
pushd“%%~fD”
回声(-----%%~nxD--------
对于(*)中的/r%%F,执行回显(%%~nxF)
回音(
邻苯二胺
)
)>>“%~dp0\\扩展名为\.txt的文件列表”

以下语法模式中
关键字中
前面的所有部分(换言之,全部大写)仅解析一次,甚至在解析时进行评估:

FOR /R [[DRIVE:]PATH] %%PARAMETER IN (set) DO command                     
FOR /F ["OPTIONS"]    %%PARAMETER IN (filenameset) DO command             
FOR /F ["OPTIONS"]    %%PARAMETER IN ("text string to process") DO command
FOR /F ["OPTIONS"]    %%PARAMETER IN ('command to process') DO command    
在您的情况下,在解析外部循环时,
for/f“tokens=*”%%I In…do(
)解析内部
for/R“%~dp0%%I”%%f In(*.*)do(
)命令 例如,如果您的脚本保存为
d:\bat\SO\32634468.bat
,它将被解析为,并作为
执行为/R“d:\bat\SO\%I”%f in(*.*)do(

假设您在名为
%I
的文件夹中有
somefile.txt
,那么您的脚本(输出确定性和准确性更改为
echo%%~dpnxf
而不是
echo%%~nf%%~xf
)应该输出如下内容

------ %I ------
d:\bat\SO\%I\somefile.txt

------ Folder1 name ------
d:\bat\SO\%I\somefile.txt

------ Folder2 name ------
d:\bat\SO\%I\somefile.txt
解决方案1:使用(功能等效)

解决方案2:


以下语法模式中
关键字中
前面的所有部分(换言之,全部大写)仅解析一次,甚至在解析时进行评估:

FOR /R [[DRIVE:]PATH] %%PARAMETER IN (set) DO command                     
FOR /F ["OPTIONS"]    %%PARAMETER IN (filenameset) DO command             
FOR /F ["OPTIONS"]    %%PARAMETER IN ("text string to process") DO command
FOR /F ["OPTIONS"]    %%PARAMETER IN ('command to process') DO command    
在您的情况下,在解析外部循环时,
for/f“tokens=*”%%I In…do(
)解析内部
for/R“%~dp0%%I”%%f In(*.*)do(
)命令 例如,如果您的脚本保存为
d:\bat\SO\32634468.bat
,它将被解析为,并作为
执行为/R“d:\bat\SO\%I”%f in(*.*)do(

假设您在名为
%I
的文件夹中有
somefile.txt
,那么您的脚本(输出确定性和准确性更改为
echo%%~dpnxf
而不是
echo%%~nf%%~xf
)应该输出如下内容

------ %I ------
d:\bat\SO\%I\somefile.txt

------ Folder1 name ------
d:\bat\SO\%I\somefile.txt

------ Folder2 name ------
d:\bat\SO\%I\somefile.txt
解决方案1:使用(功能等效)

解决方案2:


以下语法模式中
关键字中
前面的所有部分(换言之,全部大写)仅解析一次,甚至在解析时进行评估:

FOR /R [[DRIVE:]PATH] %%PARAMETER IN (set) DO command                     
FOR /F ["OPTIONS"]    %%PARAMETER IN (filenameset) DO command             
FOR /F ["OPTIONS"]    %%PARAMETER IN ("text string to process") DO command
FOR /F ["OPTIONS"]    %%PARAMETER IN ('command to process') DO command    
在您的情况下,在解析外部循环时,
for/f“tokens=*”%%I In…do(
)解析内部
for/R“%~dp0%%I”%%f In(*.*)do(
)命令 例如,如果您的脚本保存为
d:\bat\SO\32634468.bat
,它将被解析为,并作为
执行为/R“d:\bat\SO\%I”%f in(*.*)do(

假设您在名为
%I
的文件夹中有
somefile.txt
,那么您的脚本(输出确定性和准确性更改为
echo%%~dpnxf
而不是
echo%%~nf%%~xf
)应该输出如下内容

------ %I ------
d:\bat\SO\%I\somefile.txt

------ Folder1 name ------
d:\bat\SO\%I\somefile.txt

------ Folder2 name ------
d:\bat\SO\%I\somefile.txt
解决方案1:使用(功能等效)

溶液