将目录路径存储在变量中以执行命令时出错

将目录路径存储在变量中以执行命令时出错

在批处理文件中,我想运行位于另一个文件夹中的可执行文件,并将其用于当前文件夹中的文件。

我可以通过运行来实现这一点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

相关内容