2015-10-14 78 views
0

所以我有一个exe(xmllint.exe)来打印特定子目录中的一些XML文件。 xmllint.exe位于我的主目录中,我的脚本位于此目录中。以下是我迄今为止在子目录中批处理运行.exe

setlocal enabledelayedexpansion 

for /D /r %%d in (./*targetfolder) do (
    pushd %%d 
    for %%x in (*.xml) do (
     ::Get the filename, without the .old-extension 
     set "filename=%%~nx" 
     set "extension=.xml" 

     ren %%x %%~x.old 

     ::Concatenate filename and extension 
     set "finalname=!filename!!extension!" 
     xmllint.exe %%x >> !finalname! 

     del %%~x.old 
    ) 
    popd 
) 

但是,当然,它不运行在子目录xmllint.exe,因为它无法找到它。

+0

将'xmllint.exe'替换为'\ path \ to \ xmllint.exe''。或者,如果''xmllint.exe'与批处理脚本位于同一目录中,则可以执行'“%〜dp0 \ xmllint.exe”'。或者你可以将包含'xmllint.exe'的目录添加到你的'%PATH%'中。 – rojo

+0

谢谢! %〜dp0正是我所需要的! – user5417542

回答

1

你要找的%~dp0看到的for /?

call /?但我不明白,如果你xmlint之前重命名文件,您将如何能够在xmlint使用%%x

@echo off 
setlocal enabledelayedexpansion 

rem :: set the target folder first with: 
set "targetfolder=c:\path\of\target" 

for /D /r %%a in (%targetfolder%\*.xml) do (

    rem :: make a copy 
    copy "%%~a" "%%~dpna.old" 

    "%~dp0\xmllint.exe" "%%~dpna.old">> "%%~a" 

    del "%%~dpna.old" 
) 

编辑,更改FOR /R现在应该工作。

@echo off 
rem :: set the target folder first with: 
set "targetfolder=c:\path\of\target" 
for /R %targetfolder% %%a in (*.xml) do (
    rem :: make a copy 
    copy "%%~a" "%%~dpna.old" 
    "%~dp0xmllint.exe" "%%~dpna.old">> "%%~a" 
    del "%%~dpna.old" 
) 

重要提示:你必须改变行:

"%~dp0xmllint.exe" "%%~dpna.old">> "%%~a"

"%~dp0xmllint.exe" "%%~dpna.old"> "%%~a"

通过保持只有一个>就会创建该文件,而不是附加到文件。