在批处理文件中,我想运行位于另一个文件夹中的可执行文件,并将其用于当前文件夹中的文件。
我可以通过运行来实现这一点C:\directory\example\executable.exe --exampleparam examplefile
,但我想知道是否有可能做到这一点,如果C:\directory\example
是未知的并且存储在变量中。
例子:
@set folder=C:\directory\example
%folder%\executable.exe --exampleparam examplefile
我无法让它像这样工作,并且这个用例的措辞有点奇怪,并且没有发现太多与它相关的东西。
这是我的完整代码。它使用以下命令将 40 多个 MS Access 数据库(每个数据库都包含在自己的文件夹中)的内容导入到 MySQL 数据库中该计划的命令行。
@set settingsfolder="C:\Users\me\Documents\import"
@set mysqlfolder="C:\Program Files (x86)\DevDesktop\mysql\bin"
@set msa2mysfolder="C:\Program Files (x86)\Bullzip\MS Access to MySQL"
@set mdbfolder="C:\Users\me\Documents\dumps"
SETLOCAL ENABLEDELAYEDEXPANSION
@for /D %%f in (%mdbfolder%\*) do @(
@set fname=%%~nf
@set databaseid=!fname:~0,2!
@set settings=%settingsfolder%\settings.ini
@type NUL > !settings!
@echo [MoveDB MSAccess to MySQL] >> !settings!
@set importdirectory=%mdbfolder%\!fname!\db\database.mdb
@IF EXIST !importdirectory! @(
@echo sourcefilename=!importdirectory! >> !settings!
@IF !databaseid! == 001 ( type %settingsfolder%\db_init.ini >> !settings! ) ELSE ( type %settingsfolder%\db_append.ini >> !settings! )
echo Importing !databaseid!...
%msa2mysfolder%\msa2mys settings=!settings!, autorun
%mysqlfolder%\mysql --user=root -e "set @dbid=!databaseid!;UPDATE data.table1 SET db_id = @dbid WHERE db_id IS NULL;UPDATE data.table2 SET db_id = @dbid WHERE db_id IS NULL;"
echo !databaseid! finished
)
)
每次迭代时我都会遇到的错误是“未知数据库:\mysql”
如果我使用引用的路径而不是变量,它可以正常工作。
答案1
您需要将完整命令括在双引号中,而不仅仅是目录路径。
以下是您现在拥有的相关代码:
set msa2mysfolder="C:\Program Files (x86)\Bullzip\MS Access to MySQL"
...
%msa2mysfolder%\msa2mys settings=!settings!, autorun
计算结果为以下命令:
"C:\Program Files (x86)\Bullzip\MS Access to MySQL"\msa2mys settings=!settings!, autorun
但这"C:\Program Files (x86)\Bullzip\MS Access to MySQL"\msa2mys
不是一条有效命令。相反,它应该是一条有效命令"C:\Program Files (x86)\Bullzip\MS Access to MySQL\msa2mys"
(请注意结束引号如何终止该命令)。
因此,您需要将代码更改为以下形式(并相应地更新其他 SET 语句):
set msa2mysfolder=C:\Program Files (x86)\Bullzip\MS Access to MySQL
...
"%msa2mysfolder%\msa2mys" settings=!settings!, autorun
通常,应避免在SET
语句中包含双引号。等到实际执行命令时再添加双引号会更好。此外,通过不在 SET 语句中包含双引号,您可以保留合并或拆分存储在变量中的目录路径的选项,而不必担心先删除双引号。
例如如果你有以下代码:
SET MyFolder=C:\Parent folder\Child folder
SET MySubFolder=Grandchild 1
您可以轻松地将它们与以下项结合:
"%MyFolder%\%MySubFolder%"
其计算结果为有效路径"C:\Parent folder\Child folder\Grandchild 1"
。当您在初始 SET 语句中包含引号时,这要困难得多。
答案2
在我的测试中,这非常有效。
我猜你的文件夹名称中有一个空白,所以批处理文件应该是这样的:
set "folder=C:\Program Files (x86)\afolder"
"%folder%\executable.exe" params