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

我已经安装/部署到/ Program Files / STUDYvault /应用程序被称为“STUDYVault Client.exe”,并在应用程序中,一个button触发/调用一个.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,但是,当它由系统运行时(例如启动,通过registry项或启动文件夹中的快捷方式)(我尝试了Inno Setup和NSIS ),它崩溃了一个未处理的exception,“无法find指定的文件”。 我想操作系统正在执行.exe,但运行在说/ Windows或/ System32什么的。 它似乎没有问题与Visual Studio应用程序(它运行时手动执行,并find.cmd无论目录)或安装程序(它基本上只是提取/程序文件,并在启动部分的registry)

我和我的朋友想出了一个解决方法,虽然这是相当危险的。 你可以强制用户将软件安装到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隐藏安装页面,询问用户他们想要安装它的位置 – 大多数用户将保持原样,但是对于可能想要更改它的更好奇的用户来说,这将会中断安装,看到它正在调用/ Program Files(x86)/ STUDYvault in-app。

这是一个相对肮脏的修复,我觉得在这里,邪恶博士,但是…它的工作。 希望这将有助于任何人在未来有类似的问题。

用这个

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

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

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

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