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

How to launch a .bat file in VB without associating the file with the program that launched it?

好的,这个问题看起来很奇怪,但这是我发布的问题的延续 .

所以,我在 Visual Studio 中用某些行创建了一个 .bat 文件并启动它,但它基本上找不到它需要的文件,但是如果我启动它手动创建的 .bat 文件,有用。

据我所知,问题是程序启动的 .bat 文件与在文件夹中创建的文件不一样吗?

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

@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 文件的位置。我不知道如何修复它。

应该是

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 来完成,该参数包含具有完整路径的批处理文件的名称。

What does %~dp0 mean, and how does it work? 说明如何获取批处理文件的驱动器和路径。

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

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

在命令提示符 window 中执行 cd /? 后查看帮助输出以了解参数 /D 的含义(必要时也更改驱动器)。

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

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

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

与命令 cd 的区别在执行 pushd /?.

后在命令提示符 window 中输出的帮助中进行了说明

最好是创建批处理文件,所有文件都引用完整的路径、名称和文件扩展名。