Visual Basic应用程序没有在同一个安装文件夹中看到.CMD文件?

时间:2014-08-09 05:56:29

标签: vb.net windows batch-file cmd

我已经将一个应用程序安装/部署到/ Program Files / STUDYvault / called" STUDYvault Client.exe"在应用程序中,一个按钮触发/调用同一目录中的.cmd,名为' Scripts System.cmd'

    Private Sub SynchroniseToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles MenuBackup.Click
    System.Diagnostics.Process.Start("SCRIPTS SYSTEM.cmd")
End Sub

.CMD只运行基本的xcopy命令进行备份。当手动执行软件时,它会在同一目录中看到.cmd,当它由系统运行时(例如,通过注册表项或通过启动文件夹中的快捷方式启动)(我尝试了Inno Setup和NSIS) ),它以未处理的异常崩溃,'找不到指定的文件'。我认为操作系统正在执行.exe但是在/ Windows或/ System32或其他东西中运行它。它似乎不是Visual Studio应用程序的问题(它在手动执行时运行,无论目录是什么,都找到.cmd)或安装程序(它基本上只是提取到/ Program Files并在注册表的启动部分添加一个链接)

我的朋友和我想出了一个解决方法,虽然这是非常邪恶的。可以强制用户将软件安装到 C:/ Program Files / STUDYvault 并使其不可更改,然后在应用程序中指向 C: / Program Files / STUDYvault / Scripts System.cmd 而不仅仅是" SCRIPTS SYSTEM.cmd" - 这也可以吗?

我确定我只是错过了一些愚蠢的东西,因为应用程序在安装时会激活以下代码:

    Private Sub HivemindTechToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles HivemindTechToolStripMenuItem.Click
    System.Diagnostics.Process.Start("http://my-website.com.au")
End Sub

修改 好吧,我已经为有这个问题的人开发了一个解决方法。它似乎与权利有关,或者系统正在执行它;所以它从任何地方(很可能不是它的安装目录)调用.CMD - 所以我在应用程序中调用了它:

    Private Sub SynchroniseToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles MenuBackup.Click
    System.Diagnostics.Process.Start("C:\\Program Files (x86)\\STUDYvault\\SCRIPTSYSTEM.cmd")
End Sub

哪个是安装目录,然后在安装程序(Inno Setup)中我使用以下命令来定义[setup]下的安装目录:

DefaultDirName={sd}\Program Files (x86)\STUDYvault
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
DisableDirPage=yes

这里,DefaultDirName = SD \ DIRECTORY定义它将强制安装到Program Files(x86)(对于64位Windows用户来说很好,32位用户将不得不处理第二个Program Files文件夹,但x64是无论如何,在这个时代最常见的安装,所以我们不会在那里遇到问题); DisableDirPage = yes会隐藏安装页面,询问用户他们想要安装它的位置 - 大多数用户会保持原样,但对于可能想要更改它的更好奇的用户来说,这会破坏安装,因为它看起来像#39 ; s调用/ Program Files(x86)/ STUDYvault in-app。

这是一个相对肮脏的修复,我觉得像Evil博士在这里,但......它有效。希望这将有助于将来遇到类似问题的任何人。

2 个答案:

答案 0 :(得分:0)

您可以使用Environment.CurrentDirectory获取可执行文件的位置。使用此属性,无论可执行文件夹位置如何,我们都可以使代码工作(当然,只要cmd文件存在于同一文件夹中)。所以这可能是一种更合适的方式来完成工作:

Dim batchFilePath As String = Path.Combine(Environment.CurrentDirectory, _
                                            "SCRIPTS SYSTEM.cmd")
System.Diagnostics.Process.Start(batchFilePath)

您可能希望通过添加逻辑来进一步改进它,以检查batchFilePath指向的位置中是否确实存在cmd文件(您可以使用System.IO.File.Exists()来执行此操作)。

答案 1 :(得分:0)

使用此

    Process.Start(Application.StartupPath & "\SCRIPTSYSTEM.cmd")