Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在嵌套循环中使用变量%%f的批处理文件失败_Batch File - Fatal编程技术网

Batch file 在嵌套循环中使用变量%%f的批处理文件失败

Batch file 在嵌套循环中使用变量%%f的批处理文件失败,batch-file,Batch File,我对这里发生的事很困惑。它应该将从文档中找到的所有docx复制到工作目录。但由于某些原因,for循环中的%%f显示为%f。我做了个回音,它很好地打印出了文件夹。同样的情况也发生在%%r和%r上。我写的不对 set filepath=%1 for /f %%f in ('dir /ad /b %filepath%') do ( if exist "%filepath%\%%f\docs" ( for /r %filepath%\%%f\docs %%r in (*.docx) do ( echo

我对这里发生的事很困惑。它应该将从文档中找到的所有docx复制到工作目录。但由于某些原因,for循环中的%%f显示为%f。我做了个回音,它很好地打印出了文件夹。同样的情况也发生在%%r和%r上。我写的不对

set filepath=%1
for /f %%f in ('dir /ad /b %filepath%') do (
if exist "%filepath%\%%f\docs" (
for /r %filepath%\%%f\docs %%r in (*.docx) do (
echo %%f
copy %%r "%cd%\edited"
)
)
)
输出

if exist "C:\Documents\WordDocs\Data1\docs" (for /R C:\Documents\WordDocs\%f\docs %r in (*.docx) do ( 
echo Data1
copy %r "C:\Users\admin\Desktop\Test"
) ) )

此版本不将
用于/R

For/F“Delims=“%%A In('Dir/B/AD-L“%~1”)Do If Exist“%~1\%A\docs\”(
对于/F“Delims=“%%B In('Dir/B/S/A-D-L“%~1\%%A\docs\*.docx”'
)Do Echo=复制“%%~B”“%CD%\edited”)
暂停
如果您对cmd窗口中的输出感到满意,请删除第4行和第3行上的Echo=,记住取消编辑目标路径。

比其他命令更早解析(如)。此时,变量引用(如
%%f
)的
尚未识别。因此不能将包含
的根路径用于
变量引用,如
%%f
。对于的选项字符串也是如此。您也不能使用而不是
%%f

对于手边的脚本,最简单的解决方法是在
for/R
循环之前和之后使用
%filepath%\%%f\docs“
,并让
for/R
使用其默认根目录,即当前工作目录,该目录刚刚由
pushd
设置;上一个将通过
popd
恢复。下面是我的意思的演示:

set“filepath=%~1”
对于('dir/A:D/B“%filepath%”)中的/F%%F,请执行以下操作(
如果存在“%filepath%\%%f\docs”(
pushd“%filepath%\%%f\docs”
对于(“*.docx”)中的/R%%R,请执行以下操作(
回声/%%f
复制“%%~r”“%cd%\edited”
)
邻苯二胺
)
)
另一种但更复杂的方法是将
for/R
循环移动到一个子例程中,由调用它,并将根路径作为传递,如下所示:

set“filepath=%~1”
对于('dir/A:D/B“%filepath%”)中的/F%%F,请执行以下操作(
如果存在“%filepath%\%%f\docs”(
调用:子“%filepath%\%%f\docs”
)
)
后藤:EOF
:SUB
对于(“*.docx”)中的/R“%~1”%%R,请执行以下操作(
回声/%%f
复制“%%~r”“%cd%\edited”
)
后藤:EOF

引用此帖子:

但输出将其显示为%f而不是数据1。我是否只使用%f而不是%%f?直到if语句正常工作为止。当我试图在嵌套for循环中使用%%f时,它打印出%f,而不是它应该是的值。这是一个有趣的问题!似乎对/R
命令的
有一些限制,而与
%
符号无关。也许,
for/r
命令只允许文本参数而不允许变量?让我解释一下您的问题,以便其他读者能够理解。简单地说,以下命令不起作用:
for%%f in(C:\Windows)do(for/r“%%f”%%r in(*.tmp)do(echo%%r))
我多年前就注意到了这个问题,对此完全感到困惑。这也是原因之一,我尽可能使用
%%A