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

时间:2015-01-31 12:21:25

标签: vb.net windows batch-file cmd

好的,问题看起来很怪异,但这是我发布的问题的延续 here

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

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

.bat文件使用找到here的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文件的位置。我不知道如何修复它。

它应该是

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

1 个答案:

答案 0 :(得分:1)

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

但是VB.net调用批处理文件和命令行解释器 cmd.exe 而不设置工作目录。因此,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

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

在命令提示符窗口中运行%~dp0call /?时,可以阅读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 /?后在命令提示符窗口中输出。

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