如何在VB中启动.bat文件而不将文件与启动它的程序相关联?

好的,这个问题看起来很怪异,但这是我在这里发布的问题的延续。

所以,我用Visual Studio创build了一个.bat文件并启动它,但是它基本上找不到它需要的文件,但是如果我启动它手动创build的.bat文件,它就可以工作。

就我所见,问题是程序启动的.bat文件与在文件夹中创build的文件不同。

.bat文件使用Asesprite的命令行界面,例如:

@set ASEPRITE="C:\Program Files\Aseprite\aseprite.exe" %ASEPRITE% --batch animation.ase --scale 2 --save-as animation-x2.gif 

我不知道我需要分享的VB代码的哪一部分,所以问如果需要。

.bat中的错误类似于:

 C:\Users\User\Desktop\aseConverter\aseConverter\bin\Debug>"E\Asesprite\asesprite.exe" --batch skeleton2_gib3.ase --scale 1 --save-as skeleton2_gib3.gif File not found: "skeleton2_gib3.ase" Error loading file "skeleton2_gib3.ase" A document is needed before --save-as arguement 

第一行不应该是Debug文件夹,但.bat文件的创build位置。我不知道如何解决这个问题。

它应该是

 C:\Users\User\Desktop\skeleton>"E\Asesprite\asesprite.exe" --batch skeleton2_gib3.ase --scale 1 --save-as skeleton2_gib3.gif 

这里的问题是批处理文件引用没有路径的文件。 因此这些文件必须在批处理文件的当前工作目录中。

但是批处理文件和命令行解释程序cmd.exe是由VB.net调用的,不需要设置工作目录。 因此,Windows为批处理文件设置的当前工作目录与起始VB.net应用程序相同。

但是,启动的应用程序会将批处理文件和其他文件创建到不同的目录中,而不是在其当前的工作目录中。

一种解决方法是将批处理文件中的当前工作目录更改为批处理文件的存储目录。 这可以通过引用包含具有完整路径的批处理文件名称的批处理文件的参数0来完成。

%〜dp0是什么意思,它是如何工作的? 说明如何获取批处理文件的驱动器和路径。

因此,一个解决方案是使用如下的批处理文件:

 @echo off cd /D "%~dp0" set "ASEPRITE=%ProgramFiles%\Aseprite\aseprite.exe" "%ASEPRITE%" --batch animation.ase --scale 2 --save-as animation-x2.gif 

执行cd /?后看到帮助输出 在参数/D含义的命令提示符窗口中(如有必要,也可以更改驱动器)。

运行call /?可以读取%~dp0的解释call /?for /? 在命令提示符窗口中。

另一种可能性是使用以下批处理代码:

 @echo off pushd "%~dp0" set "ASEPRITE=%ProgramFiles%\Aseprite\aseprite.exe" "%ASEPRITE%" --batch animation.ase --scale 2 --save-as animation-x2.gif popd 

与命令cd的不同之处在于在执行pushd /?之后在命令提示符窗口中输出的帮助中解释pushd /?

最好的办法是创建带有完整路径,名称和文件扩展名的所有文件的批处理文件。