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

Windows 如何在同一文件夹中的文件上执行目录树的每个特定文件夹中存在的应用程序?,windows,batch-file,Windows,Batch File,我有一些不同名称的文件夹。每个文件夹都有如下所列的特定结构: 文件夹1 内容 x64 Folder1.aaxplugin TransVST_Fixer.exe 文件夹2 内容 x64 文件夹2.aaxplugin TransVST_Fixer.exe 每个子文件夹中有两个文件x64。一个文件与上面两个文件夹级别的文件夹同名。另一个文件是一个.exe文件,其名称在所有文件夹中都相同 现在我需要在每个特定的.exe文件上运行文件扩展名为aaxplugin的文件。打开每个文

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

  • 文件夹1
    • 内容
      • x64
        • Folder1.aaxplugin
        • TransVST_Fixer.exe
  • 文件夹2
    • 内容
      • x64
        • 文件夹2.aaxplugin
        • TransVST_Fixer.exe
每个子文件夹中有两个文件
x64
。一个文件与上面两个文件夹级别的文件夹同名。另一个文件是一个.exe文件,其名称在所有文件夹中都相同

现在我需要在每个特定的.exe文件上运行文件扩展名为
aaxplugin
的文件。打开每个文件夹并将每个文件拖放到.exe上以在该文件上运行显然非常耗时

这就是为什么我试图创建一个批处理脚本来节省一些时间

我在这里寻找有关堆栈溢出的解决方案。到目前为止,我发现的唯一一件事是一个用户这样说:当我执行拖放时,会执行“fileprocessor.exe”进程。但是,当我尝试启动这个exe时,CMD返回错误(“无法识别或无法批处理文件”之类)

我该怎么做


更新日期:2015年12月22日

我首先使用了一个带有以下行的批处理文件,将可执行文件复制到
Folder1
x64
子文件夹中

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"
不幸的是,输出如下

C:\Users\Davide\Desktop>for /F "delims=" %F in ('dir /b /s x64\*.aaxplugin') do "%~dpFTransVST_Fixer.exe" "%F"
The system cannot find the file specified.

你的问题不太清楚,但看起来,类似这样的问题应该可以解决:

for /f "delims=" %%f in ('dir /b /s X64\*.ext') do "%%~dpfMyExe.exe" "%%f"
可能您必须将目录更改为每个文件夹(取决于您的.exe):

假设:

  • 目录结构是固定的,文件确实位于子文件夹
    contents\X64\

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

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


尝试以下批次代码:

@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递归搜索计算机上扩展为
C:\Users\Davide\Desktop
的目录
%USERPROFILE%\Desktop\test
的所有目录中的文件扩展名为
aaxplugin
。循环变量
F
在每个循环运行中都包含找到的文件名,该文件的完整路径不带双引号

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

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

必须在此处使用延迟扩展来引用环境变量
FilePath
的值,因为它是在用
定义的块中定义和计算的。否则,命令处理器将在解析整个块时展开
%FilePath%
,导致执行时出现语法错误,因为在循环的主体块上方未定义环境变量
FilePath

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

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

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\"
因此,对于两个*.aaxplugin文件,条件都是true,因为比较的字符串不相同

也可能是:

@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
但实际上并不需要命令DIR,因为它可以在第一个提供的代码中看到

但是,如果应用程序
TransVST_Fixer.exe出于某种未知原因仅在文件目录也是当前目录的情况下才能正常工作,则可以使用以下批处理代码,而不是使用命令pushdpopd的第一个代码:

@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
与第一个代码相比,还有一个区别。现在,将文件路径的最后5个字符与字符串
\x64\
进行不区分大小写的比较。因此,文件必须位于名为
x64
x64
的文件夹中。在文件路径的任何其他位置,名为
x64
x64
的文件夹不再像前两个批处理代码那样导致该条件的true状态

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

@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
,则不会产生任何区别

小写的
f
在这里也可以作为循环变量使用,但如上所述,通常存在问题

要了解使用的命令及其工作方式,请打开命令提示窗口,在其中执行
@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
for /d %%d IN (./*) do (cd "%%d/Contents/x64" & "../../../TransVST_Fixer.exe" "%%d" & cd "/Program Files (x86)\Common Files\Avid\Audio\Plug-Ins")
cd "/Program Files (x86)\Common Files\Avid\Audio\Plug-Ins"
for %%d IN (*.aaxplugin) do (mkdir "%%d_temp/Contents\x64" & move "%%d" "%%d_temp/Contents\x64/%%d" & rename "%%d_temp" "%%d")