如何在同一文件夹中的文件上执行目录树的每个特定文件夹中存在的应用程序?

时间:2015-12-21 17:37:39

标签: windows batch-file

我有一些不同名字的文件夹。每个文件夹都有一个特定的结构,如下所示:

  • Folder1中
    • 内容
      • 64
        • Folder1.aaxplugin
        • TransVST_Fixer.exe
  • 文件夹2
    • 内容
      • 64
        • 文件夹2.aaxplugin
        • TransVST_Fixer.exe

每个子文件夹x64中有两个文件。一个文件与上面的文件夹两个文件夹级别具有相同的名称。另一个文件是.exe文件,其名称在所有文件夹中都相同。

现在我需要在每个特定的.exe文件上运行文件扩展名为aaxplugin的文件。打开每个文件夹并拖拽和放置显然非常耗费时间。删除.exe上的每个文件以在此文件上运行它。

这就是我尝试创建批处理脚本以节省时间的原因。

我在Stack Overflow上寻找解决方案。到目前为止,我发现的唯一一件事是用户说:当我执行拖拽时drop,进程'fileprocessor.exe'被执行。但是,当我尝试启动此exe时,CMD会返回错误(“无法识别或不是批处理文件”)。

我该怎么做?

2015年12月22日更新

我首先使用带有以下行的批处理文件将可执行文件复制到x64的{​​{1}}子文件夹中。

Folder1

在问这里后,我尝试了以下脚本:

for /d %%a in ("C:\Users\Davide\Desktop\test\Folder1\*") do ( copy "C:\Program Files\Sugar Bytes\TransVST\TransVST_Fixer.exe" "%%a\x64\" 2> nul )

不幸的是,输出结果如下

for /f "delims=" %%F in ('dir /b /s x64\*.aaxplugin') do "%%~dpFTransVST_Fixer.exe" "%%F"

3 个答案:

答案 0 :(得分:0)

你的问题不是很清楚,但似乎这样的事情应该有效:

for /f "delims=" %%f in ('dir /b /s X64\*.ext') do "%%~dpfMyExe.exe" "%%f"

也许您必须将目录更改为每个文件夹(取决于您的.exe):

for /f "delims=" %%d in ('dir /B /ad') do (
    pushd "%%d"
    for /f "delims=" %%f in ('dir /b "contents\x64\*.ext"') do (
        cd Contents\x64
        MyExe.exe "%%f"
    )
    popd
)

假设:

  • 目录结构已修复,文件确实位于子文件夹contents\X64\中。

  • MyExe.exe在每个文件夹中都是相同的(名称)。

  • 每个文件夹中只有一个文件* .ext。

答案 1 :(得分:0)

尝试以下批处理代码:

@echo off
setlocal EnableDelayedExpansion
for /R "%USERPROFILE%\Desktop\test" %%F in (*.aaxplugin) do (
    set "FilePath=%%~dpF"
    if not "!FilePath:\x64\=!" == "!FilePath!" "%ProgramFiles%\Sugar Bytes\TransVST\TransVST_Fixer.exe" "%%F"
)
endlocal

带有选项/R FOR 命令会在您的计算机上展开的目录%USERPROFILE%\Desktop\test的所有目录中递归搜索C:\Users\Davide\Desktop以查找文件扩展名为{{ 1}}。循环变量aaxplugin在每个循环中包含找到的文件的名称,其中包含完整路径而不包含双引号。

每个找到的文件的驱动器和路径都分配给环境变量F

接下来,在文件路径之间进行区分大小写的字符串比较,并且所有出现的字符串FilePath都不区分大小写,并且未修改文件路径。

环境变量\x64\的引用值必须在此处使用延迟扩展来完成,因为在使用FilePath ... (定义的块中定义和评估。否则,命令处理器会在解析整个块时扩展),从而导致执行时出现语法错误,因为无法进行字符串替换,因为在 FOR %FilePath% >循环。

如果文件路径包含名称为FilePath的文件夹,则字符串相等。这意味着在提供的文件夹结构上,文件位于文件夹x64而不是其他位置,因此应用程序将从其原始位置执行,以修复找到的* .aaxplugin文件。

IF 的行用于文件夹结构示例:

x64

因此,对于* .aaxplugin文件,条件为 true ,因为比较的字符串不相同

也可能是:

if not "C:\Users\Davide\Desktop\test\Folder1\Contents" == "C:\Users\Davide\Desktop\test\Folder1\Contents\x64\"
if not "C:\Users\Davide\Desktop\test\Folder 2\Contents" == "C:\Users\Davide\Desktop\test\Folder 2\Contents\x64\"

但是命令 DIR 并不是必需的,因为它可以在第一个提供的代码中看到。

但是,如果应用程序@echo off setlocal EnableDelayedExpansion for /F "delims=" %%F in ('dir /A-D /B /S "%USERPROFILE%\test\*.aaxplugin" 2^>nul') do ( set "FilePath=%%~dpF" if not "!FilePath:\x64\=!" == "!FilePath!" "%ProgramFiles%\Sugar Bytes\TransVST\TransVST_Fixer.exe" "%%F" ) endlocal 出于某种未知原因只使用文件目录也是当前目录,则可以使用以下批处理代码而不是使用命令 pushd <的第一个代码/ strong>和 popd

TransVST_Fixer.exe

与第一个代码相比,还有一个区别。现在,文件路径的最后5个字符与字符串@echo off setlocal EnableDelayedExpansion for /R "%USERPROFILE%\test" %%F in (*.aaxplugin) do ( set "FilePath=%%~dpF" echo !FilePath! if /I "!FilePath:~-5!" == "\x64\" ( pushd "%%~dpF" "%ProgramFiles%\Sugar Bytes\TransVST\TransVST_Fixer.exe" "%%~nxF" popd ) ) endlocal 不区分大小写。因此,该文件必须位于名为\x64\x64的文件夹中。文件路径中任何其他位置的名称为X64x64的文件夹不会再出现在条件的 true 状态,就像前两个批处理代码一样。

但是,如果出于某种未知原因,确实需要在找到的* .aaxplugin的同一文件夹中运行该应用程序,并且该文件的目录必须是当前目录,则可以使用以下批处理代码:

X64

@echo off setlocal EnableDelayedExpansion for /R "%USERPROFILE%\test" %%# in (*.aaxplugin) do ( set "FilePath=%%~dp#" if /I "!FilePath:~-5!" == "\x64\" ( pushd "%%~dp#" "%%~dp#TransVST_Fixer.exe" "%%~nx#" popd ) ) endlocal 引用的文件的路径总是以反斜杠结尾,这就是为什么%%~dpF没有反斜杠的原因(虽然命令处理器也可以在路径中处理带有两个反斜杠的文件) )。

在上面的批处理代码中,字符TransVST_Fixer.exe用作循环变量,因为#%%~dp#TransVST_Fixer.exe相比更容易阅读。对于使用%%~dpFTransVST_Fixer.exe作为循环变量的人来说,更清楚的是循环变量的引用结束并且应用程序的名称开始于何处。对于命令处理器,如果循环变量为#或大写#,则无效。

小写F在这里也可以作为循环变量使用,但如Modify variable within loop of batch script所述,通常会出现问题。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • f
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • popd /?
  • pushd /?
  • set /?

答案 2 :(得分:0)

我将为您提供我为此创建的脚本,希望它适合您

for /d %%d IN (./*) do (cd "%%d/Contents/x64" & "../../../TransVST_Fixer.exe" "%%d" & cd "/Program Files (x86)\Common Files\Avid\Audio\Plug-Ins")

请注意我将修复程序放在根文件夹中,所以我只需复制一次。您必须将它放在根文件夹中并执行它。它的作用:

  1. 遍历每个文件夹
  2. 对于它进入的每个/ Contents / x64,执行修复程序(上面是3级),之后返回到原始文件夹。
  3. 如果您的插件位于不同的文件夹中,则只需更改此部分即可替换插件所在的路径。

    cd "/Program Files (x86)\Common Files\Avid\Audio\Plug-Ins"
    

    请记住将脚本放在该文件夹上。在本例中,我将脚本放在“/ Program Files(x86)\ Common Files \ Avid \ Audio \ Plug-Ins”文件夹中并运行它(作为.bat)。

    PS:修复程序将固定插件放在“C:\ Users \ Public \ modified”中(只是在执行时读取屏幕,它会为您提供新文件路径。如果您想将它们移动到正确的路径,您可以从新文件路径(“C:\ Users \ Public \ modified”)

    执行此操作
    for %%d IN (*.aaxplugin) do (mkdir "%%d_temp/Contents\x64" & move "%%d" "%%d_temp/Contents\x64/%%d" & rename "%%d_temp" "%%d")
    

    有了这个,我遍历每个插件并创建一个具有相同名称的文件夹(我创建_temp因为名称colision,移动文件后我将其重命名为正确的文件),同时使用子文件夹“/ Contents / x64 “,并将插件移到里面。一旦捐赠,您可以将结果文件夹放在正确的路径中。

    希望它有效,对我来说它就像一个魅力。