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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 如果具有不同扩展名的对应文件没有';不存在于子目录中_Batch File - Fatal编程技术网

Batch file 如果具有不同扩展名的对应文件没有';不存在于子目录中

Batch file 如果具有不同扩展名的对应文件没有';不存在于子目录中,batch-file,Batch File,我有一个文件夹和一堆.rst文件,还有一个文件夹和一堆分散在子目录中的.md文件。对于每个.rst文件,我想检查是否有同名的对应.md文件。如果没有相应的.md文件,我想删除.rst文件 以下是我目前掌握的情况: for %%A in (buildfiles\source\*.rst) do if not exist "%%~nA.md" del "%%A" 只要.md文件与批处理文件都在同一目录中,这项功能就可以工作。我搞不懂的是如何让它搜索特定文件夹的所有子目录,以确定相应的.md文件是否

我有一个文件夹和一堆.rst文件,还有一个文件夹和一堆分散在子目录中的.md文件。对于每个.rst文件,我想检查是否有同名的对应.md文件。如果没有相应的.md文件,我想删除.rst文件

以下是我目前掌握的情况:

for %%A in (buildfiles\source\*.rst) do if not exist "%%~nA.md" del "%%A"
只要.md文件与批处理文件都在同一目录中,这项功能就可以工作。我搞不懂的是如何让它搜索特定文件夹的所有子目录,以确定相应的.md文件是否不存在。例如,这并不完全符合我的要求:

for %%A in (buildfiles\source\*.rst) do if not exist "pages\%%~nA.md" del "%%A"
因为它只搜索特定的“pages”文件夹,而不是它的所有子目录

编辑添加:我已经广泛搜索了该网站,我知道/S通常用于搜索子目录,但如果只是在“如果不存在”之后加上,它就不起作用了。例如,这会给出一个错误:

for %%A in (buildfiles\source\*.rst) do if not exist "pages\%%~nA.md" /S del "%%A"

如何获取要在子目录中搜索的“如果不存在”部分?

方法1:仅1个命令行:

for%%A in(buildfiles\source\*.rst)do(msr-rp pages-l-f“%%~nA.md”和&del“%%A”)

  • msr-rp xxx
    和&
    del xxx
    表示
    未找到
    (return=
    %ERRORLEVEL%
    =0)因此可以
    删除
  • 要隐藏
    msr.exe的输出
    add
    >nul
    如:
    msr-rp pages-l-f“%%~nxA.md”>nul
方法2:4行:使用
!错误等级SetLocal EnableExtensions EnableDelayedExpansion

for %%A in (buildfiles\source\*.rst) do (
  msr -rp pages -l -f "%%~nA.md" >nul
  if %ERRORLEVEL% EQU 0 del "%%A"
)
msr.exe
/
msr.gcc*
是一个单一的exe工具,在我打开的项目
tools
目录中没有依赖项。文档是内置的,只需运行它;或者从上面的链接或

(如果您的windows是x86/32位计算机,请使用
msr-Win32.exe

添加更多快速方法:(以上两种方法扫描
页面
中的每个
rst
文件

添加了
nin.exe
,该文件与
msr.exe
位于同一位置;通过3个命令管道(2个
msr.exe
+1个
nin.exe
命令)递归搜索
buildfiles\source
pages
仅1次

  • 方法3:生成命令(
    -o“del xxx”
    )并执行
    del
    (通过
    -X
    ),您可以预览生成的
    del
    命令,而无需
    -X
    ;通过
    -X-PAC
    隐藏一些输出:

    msr-rp buildfiles\source,pages-l-f“\(rst \\\/]+)\(rst \\/]+)\(rst \\/]+)”-updAC | msr-x buildfiles\source-t“^1\D.*:\s*(.+)\s*”-o“del”$1'-x

  • 方法4:获取文件列表并删除:(需要将
    循环中的每个管道
    转义到
    ^
    ,这就是为什么我更喜欢
    -X
    类似方法3的简单情况)

    for/f“tokens=*”%%a in('msr-rp buildfiles\source,pages-l-f“\(rst | md)$”-PIC^ nin nul”([^\/]+)\(rst | md)$”-updAC^ msr-x buildfiles\source-t“^1\D.*:\s*(.s*)\s*$-o”$1)-PAC)do del a


您也可以使用
msr-x.rst“-t“^1\D.*:\s*(.+)\s*$”-o“$1”
msr-t“^1\D.*:\s*(.+\.rst)\s*$-o“$1”
而不是
msr-x构建文件\source-t“^1\D.*:\s*(.+)\s*$”-o“$1”
,以获得孤立的文件(1次匹配).

在这里搜索子目录是一个相对常见的问题,您是否尝试过站点搜索功能?是的,通常是用/s完成的,我以前在目录之间复制文件时使用过它。但是将它与“如果不存在”部分一起使用是不起作用的。如果我只是像这样加上它:对于%%a in(buildfiles\source*.rst)如果不存在,则使用它pages\%%~nA.md“/S echo(del“%%A”)它给出错误“/S未被识别为内部或外部命令。“我感谢您的回答,但我需要能够使用标准的批处理文件命令来执行此操作。批处理文件将由多人使用,我不能保证他们能够安装您的工具。@Daerruint:是的,您说得对,因为这2个exe文件需要下载。对于批处理脚本,您可以使用:
For%%A in(buildfiles\source\*.rst)do(dir/s/b“pages\%%~nA.md”2>nul | | del“%%A”)
,但很抱歉我在vacaion上回复得太晚了。我想你可能找到了正确的解决办法。