我整个上午一直在努力,所以我来这里寻求帮助。阅读很多有关此问题的SO问题并尝试了所有解决方案,但没有解决我的问题。
我刚开始只使用Process.Start(batchfile.bat);
它适用于某些计算机但不适用于其他计算机。在批处理文件不起作用的计算机上,命令提示符打开并显示
'ogr2ogr.exe' is not recognized as an internal or external command, operable program or batch file.
如果打开命令提示符并运行它,但不是通过双击批处理文件,该命令可以正常工作。所以我开始尝试使用ProcessStartInfo。
我正在选择一个文件并阅读该文件。我从文件中读到的内容并不重要。
strFilePath = Path.GetDirectoryName(openFileDialog1.FileName);
此时strFilePath = O:\\03 Supervisors\\04_Production\\test
O:是映射驱动器。
我在该位置创建一个批处理文件并向其写入一些命令。
File.CreateText(strFilePath + "\\" + "kml2shp.bat").Dispose();
我在批处理文件中写入要执行的命令。
ogr2ogr.exe -f "ESRI Shapefile" "O:\03 Supervisors\04_Production\test\Final.shp" "O:\03 Supervisors\04_Production\test\_Map.kml"
PAUSE
我的代码启动过程现在是
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
if (File.Exists(strFilePath + "\\kml2shp.bat") == false)
{
MessageBox.Show("File is missing");
}
startInfo.FileName = strFilePath + "\\kml2shp.bat";
startInfo.LoadUserProfile = false;
startInfo.Domain = "mydomain";
startInfo.UserName = "myusername";
startInfo.Password = MakeSecureString("mypassword");
startInfo.UseShellExecute = false;
Process.Start(startInfo);
}
catch (Win32Exception w32E)
{
MessageBox.Show(w32E.ToString());
}
private static SecureString MakeSecureString(string text)
{
SecureString secure = new SecureString();
foreach (char c in text)
{
secure.AppendChar(c);
}
return secure;
}
如果我没有定义域,用户和密码,则命令提示符会显示。
'ogr2ogr.exe' is not recognized as an internal or external command, operable program or batch file.
当我这样做时,它无法找到该文件。
那么为什么我的File.Exists(strFilePath + "\\kml2shp.bat")
会通过,但过程无法找到该文件?
我试过了
startInfo.WorkingDirectory = strFilePath + "\\";
startInfo.FileName = "kml2shp.bat";
看起来它似乎不喜欢过程中的路径O:\\03 Supervisors\\04_Production\\test
我假设路径中的空间,但我尝试了20种不同的方法尝试用双引号括起来但没有成功。有什么想法吗?
答案 0 :(得分:2)
映射的驱动器不是全局的,它们特定于登录会话。通过提供凭据,您要求Process.Start
在单独的登录会话中运行该程序,因此当该进程尝试启动时,您的映射驱动器将不再可用。因此,"找不到路径"和"目录名无效"错误。
听起来好像你需要凭证一样,所以只需摆脱它们并解决原始问题:批处理器无法找到{{1} }。最简单的解决方案可能是提供可执行文件的完整路径作为批处理文件的一部分。或者,如果批处理文件实际上没有必要(从问题中解释为什么您首先使用的那个),您可以尝试使用ogr2ogr.exe
直接运行可执行文件。