批处理文件:如果文件包含另一个文件的文件名,则将文件移动到子文件夹中

时间:2013-09-09 10:25:21

标签: search batch-file filenames move

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

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

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

以下是2个示例文件:

  • f100 .nc1”
  • “999-P- f100 - PLATE - Rev 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 个答案:

答案 0 :(得分: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"
  )
)

答案 1 :(得分: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 (

答案 2 :(得分: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

答案 3 :(得分: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文件列表)