Batch file 为什么';我的批处理找不到列出子文件夹文件的路径?
我一直在想为什么%%dp0 plus%%我似乎不在嵌套的for中工作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"
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:使用(功能等效)
溶液