2

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

所以当前的逻辑是:如果 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"
        )
    )

预先感谢您的任何帮助。我已经在这个阶段停留了一段时间,并且正在努力理解分隔符、字符串和通配符。

4

4 回答 4

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"
  )
)
于 2013-09-09T11:02:59.233 回答
1

你可以使用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 (
于 2013-09-09T11:12:15.543 回答
0

未测试:

@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
于 2013-09-09T11:01:57.880 回答
0

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

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 文件列表)

于 2013-09-09T11:02:06.633 回答