我有一些不同名字的文件夹。每个文件夹都有一个特定的结构,如下所示:
每个子文件夹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"
答案 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
的文件夹中。文件路径中任何其他位置的名称为X64
或x64
的文件夹不会再出现在条件的 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")
请注意我将修复程序放在根文件夹中,所以我只需复制一次。您必须将它放在根文件夹中并执行它。它的作用:
如果您的插件位于不同的文件夹中,则只需更改此部分即可替换插件所在的路径。
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 “,并将插件移到里面。一旦捐赠,您可以将结果文件夹放在正确的路径中。
希望它有效,对我来说它就像一个魅力。