【问题标题】:Batch file to: move files into a sub folder if they contain the filename of another file批处理文件到:如果文件包含另一个文件的文件名,则将文件移动到子文件夹中
【发布时间】:2013-09-12 19:40:14
【问题描述】:

此代码非常适合我将具有相同文件名但扩展名不同的文件移动到子文件夹中。

所以当前的逻辑是:如果 NC1 文件与 PDF 文件具有相同的文件名,则将该 NC1 移动到其各自的子文件夹中。

但是我的文件没有相同的文件名。

以下是 2 个示例文件:

  • "f100.nc1"
  • “999-P-f100 - 板 - 修订版 0 - 287x200.pdf”

如何更改此代码以遵循此逻辑:如果 PDF 文件名包含 NC1 文件的文件名,则将该 NC1 移动到其各自的子文件夹。

    for %%j in ("..\2PDF_Outsourced\1PDF_Heavy\*.pdf") do (
        if exist "%%~nj.nc1" (
            move /-y "%%~nj.nc1" "\2NC1_Outsourced\1NC1_Heavy"
        )
    )

    for %%j in ("..\2PDF_Outsourced\1PDF_Light\*.pdf") do (
        if exist "%%~nj.nc1" (
            move /-y "%%~nj.nc1" "\2NC1_Outsourced\1NC1_Light"
        )
    )

提前感谢您的帮助。我被困在这个阶段有一段时间了,很难理解分隔符、字符串和通配符。

【问题讨论】:

  • 感谢大家的快速回复。我会尝试他们并做出回应。

标签: search batch-file filenames move


【解决方案1】:

诀窍是颠倒你的逻辑。迭代 .nc1 文件,然后查看是否存在匹配的 .pdf(使用通配符)。为 Heavy 和 Light 添加第二个循环可避免代码复制。

for %%F in ("*.nc1") do for %%P in (Heavy Light) do (
  if exist "..\2PDF_Outsourced\1PDF_%%P\*%%~nF*.pdf" (
    if exist "%%F" move /-y "%%F" "\2NC1_Outsourced\1NC1_%%P"
  )
)


编辑

我在上面的代码中添加了第二个 IF EXIST,以防万一名称与 Heavy 和 Light pdf 文件匹配。

如果 Endoro 关于忽略匹配更大单词的子字符串的名称的担忧是有效的,那么可以扩展上述内容:

for %%F in ("*.nc1") do (
  set "name=%%~nF"
  setlocal enableDelayedExpansion
  for %%C in (. [ ^^) do set "name=!name:%%C=\%%C!"
  for %%N in (!name!) do (
    endlocal
    for %%P in (Heavy Light) do for /f "eol=: delims=" %%A in (
      'dir /b /a-d "..\2PDF_Outsourced\1PDF_%%P\*%%~nF*.pdf"^|findsdr /i "\<%%N\>"'
    ) do if exist "%%F" move /-y "%%F" "\2NC1_Outsourced\1NC1_%%P"
  )
)

【讨论】:

  • 谢谢dbenham。我现在正在使用此代码。上面的第一个代码适合我,因为另一个文件名中永远不会有相同的字符串。
【解决方案2】:

你可以使用findstr:

REM this is true
echo(999-P-f100 - PLATE - Rev 0 - 287x200|findstr "\<f100\>"

REM this is false
echo(999-P-f1000 - PLATE - Rev 0 - 287x200|findstr "\<f100\>"

REM also false
echo(999-P-f10 - PLATE - Rev 0 - 287x200|findstr "\<f100\>"

您可以将其放入 for 循环中:

for %%i in (*.nc1) do (
    for /f "delims=" %%j in ('dir /a-d /b "..\2PDF_Outsourced\1PDF_Heavy\*.pdf"^|findstr /i "%%~ni"') do (

【讨论】:

  • +1,OP 未发现的有趣案例。不确定这是否是一个真正的问题。可能需要转义包含正则表达式元字符 .[^ 的文件名。
  • 谢谢 Endoro。我仍在努力为我完成这项工作。但我是批处理文件的新手,有点挣扎。我正在成功使用另一个答案。但我会继续尝试了解您的经验技术。
【解决方案3】:

未测试:

@echo off

call :copy_pdf "\2NC1_Outsourced\1NC1_Light"
call :copy_pdf "\2NC1_Outsourced\1NC1_Heavy"
goto :eof

:copy_pdf [%1 - directory to search]
if not exist "%~1\" echo dir not exist >2 & exit /b 1
pushd "..\%~1"
for %%N in (*.nc1) {
    for /f "delims=" %%P in ('dir /b /s /a:-d *.pdf^| find /i "%%~nN"') do (
        move /-y "%%~nP.nc1" "%~1" 
    ) 
)
popd

【讨论】:

    【解决方案4】:

    这是一种可以帮助您入门的蛮力方法

    for %%a in ("*.nc1") do (
      for %%b in ("*.pdf") do (
        echo.%%~nb | findstr /i /c:"%%~na" 1>nul
        if not errorlevel 1 (
          echo %%~na found in %%~nb
        )  
      )
    )
    

    如果您有很多 NC1 和 PDF 文件,那么您可能需要优化此方法(例如通过存储 PDF 文件列表)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多