首页 > 解决方案 > 批处理文件检查文件夹中具有其他扩展名的相同文件名

问题描述

有人可以帮我解决这个问题。我的问题与这个问题类似,但我需要它也可以在子目录中工作。 批处理文件检查同名文件

简而言之,有些文件从程序(.XCS 扩展名)导出到带有子文件夹的文件夹中。首先,我调用一个工具(xconverter)来转换 pgmx 中的文件。然后我想检查是否生成了 PGMX 文件,因为如果 XCS 内部出现错误,转换器将不会生成 pgmx。所以验证是这样的,test1.xcs进去了,我想看看转换后文件夹里面有没有test1.pgmx出来。如果未生成 pgmx 文件,则必须将相应的 xcs 移动到 xcs 所在文件夹内的“错误”文件夹,并且在移动它们后具有 .err 扩展名,因此很明显该文件不正确。

我搜索了几个小时,如果文件夹中只有一个文件,则下面的代码可以工作,但是当有更多 xcs 文件未生成 pgmx 时,批处理会给出“找不到路径”错误,因为它似乎搜索xcs 文件已复制到“错误”文件夹。

此外,但不是必须的,如果批处理可以创建一个日志文件 (txt),其中包含未转换为 pgmx 的 XCS 文件的名称,那就太好了。

我现在拥有的代码:

set PROG=C:\Program Files (x86)\SCM Group\Maestro\XConverter.exe
set TOOL=C:\Program Files (x86)\SCM Group\Maestro\tlgx\def.tlgx
set DIR=%%~df%%~pf
set ERF=Error
set MoveToFolder=%DIR%%ERF%\

echo Delete old pgmx files

DEL /S /Q *.pgmx

echo start conversion

for /R %%f in (*.xcs) do (
                echo "%%f"
Call "%PROG%" ^
-s -m 3  ^
-i "%%f" -t "%TOOL%" -o "%DIR%%%~nf.pgmx" -m 0^              

PushD %DIR%
For /f "delims=" %%Z in ('Dir /B *.xcs') Do (
  Set "FoundPgmx="
  For /f "delims=" %%P in (
    'Dir /B "%%~nZ*" ^| findstr /i "\.pgmx$" '
  ) Do Set FoundPgmx=yes
  If not defined FoundPgmx (
    echo Error in %%f
    if not exist %MoveToFolder% md %MoveToFolder%
    move %%Z "%MoveToFolder%%%~nf.err" )
PopD
)
)

echo pgmx created

解决了


最终代码:

@ECHO OFF

Title XCS 2 PGMX

set PROG=C:\Program Files (x86)\SCM Group\Maestro\XConverter.exe
set TOOL=U:\Accord 25\Tlgx\def.tlgx

echo ----------
echo start Conversion
echo ----------

DEL /S /Q *.pgmx

for /R %%f in (*.xcs) do (
                echo "%%f"
Call "%PROG%" ^
-s -m 3  ^
-i "%%f" -t "%TOOL%" -o "%%~pf%%~nf.pgmx" -m 0^              
                )

echo ----------
echo PGMX Generated
echo ----------
echo ----------
echo Start verification
echo ----------


DEL /S /Q errorlog.txt
rmdir /s /Q "%~dp0\error"

md error

SETLOCAL ENABLEDELAYEDEXPANSION

for /R %%a in (*.xcs) do (
    if not exist %%~pa%%~na.pgmx (
    SET CDIR=%%~pa%
    SET _CDIR=!CDIR:~1,-1!
    for %%i in ("!_CDIR!") do (SET ParentFolderName=%%~nxi
        move "%%a" "%~dp0error\!ParentFolderName!_%%~na.err" 
        echo %%a >> %~dp0errorlog.txt
   ) 
  )
 )

ENDLOCAL

DEL /S /Q *.xcs

cd %~dp0/error
ren *.err *.xcs
cd ..
rmdir "%~dp0/error"

timeout -t 5

标签: windowsbatch-filecmd

解决方案


试试这个!但是,它不会重命名文件。这是不必要的,因为它们将列在日志文件中。

for /R %%a in (*.xcs) do (
    if exist %%~paerror if not exist %%~pa%%~na.pgmx (
        copy /b %%a %%~paerror
        echo %%a >> %%~palog.txt
    )
)

推荐阅读