嘿,我一直试图将批处理脚本实现到我的VB.NET应用程序中。我的应用程序所做的是检查新版本是否可用,是否可以将其下载到应用程序数据文件中。然后它创建一个Batch脚本,运行它并自行关闭。
从此处批处理脚本获取更新版本,获取并替换过期版本。批处理脚本将运行更新的版本(它将与已移动的过期版本位于同一目录中)并运行它。然后批处理文件将自毁。我试过这样做,但它所做的只是运行新版本,就是这样。它甚至没有自毁?这是我的批处理脚本:
@echo off
Type "file"
ping -n 10 localhost >nul 2>&1
xcopy /y "C:\Documents and Settings\Mumit\Application Data\Icarus" "C:\Documents and Settings\Mumit\Desktop\Icarus\Icarus\Icarus\bin\Debug\Icarus"
start /d "C:\Documents and Settings\Mumit\Desktop\Icarus\Icarus\Icarus\bin\Debug" Icarus
DEL"file"
DEL %0
EXIT
正如你所看到的那样只有几行。任何人都可以帮我把它移植到VBS吗?我很感激。
这是我在.NET中编写它的方式:
Dim s As New Text.StringBuilder
s.Append("@echo off" + Environment.NewLine + "Type " + ChrW(34) + "file" + ChrW(34) +
Environment.NewLine + "ping -n 10 localhost >nul 2>&1" +
Environment.NewLine + "xcopy /y " + File2 + " " + File1 +
Environment.NewLine + "start /d " + ChrW(34) + Splitter(IO.Path.GetDirectoryName(CStr(Splitter(File1)))) + ChrW(34) + " " + IO.Path.GetFileName(CStr(Splitter(File1))) +
Environment.NewLine + "DEL" + ChrW(34) + "file" + ChrW(34) +
Environment.NewLine + "DEL %0" +
Environment.NewLine + "EXIT")
答案 0 :(得分:1)
如果您已经使用.NET - 并让它执行创建批处理...您也可以批量处理。如果你使用它作为网关,能够做传统的文件副本......那么你做错了。
使用以下代替批处理命令:
System.IO.File.Copy(SourceFile, DestinationFolder, true);
这将覆盖现有文件并完成。
注意用于复制的Powershell脚本:
Copy-Item c:\scripts\test.txt c:\test
答案 1 :(得分:1)
这基本上是一个Windows操作系统问题。 我在一些非常自定义的场景中进行部署之前遇到过这个问题,其他部署方法不适合。
您无法删除正在使用的文件: TRUE
您无法重命名正在使用的文件: FALSE
您可以重命名正在运行并使用该文件的.NET EXE 的任何EXE或DLL文件(可能还有许多其他场景)
你能做的就是这个。
1)使用一些常见但可检测的前缀或后缀重命名程序文件夹中的所有文件。例如“ShadowCopy_TIMESTAMP_ORIGINALFILE.EXT”,您可以使用时间戳来确保唯一的文件名。
2)将所有新文件复制到目录中,没有人会因为重命名而无法识别。
3)使用刚创建的新EXE重启您的应用程序。
4)在应用程序启动时,在后台线程中运行一个例程,等待几秒钟,并删除所有具有“ ShadowCopy _ * ”模式的文件,以执行不需要的文件的清理
(您可以直接在.NET应用程序中使用其他语言来处理文件,例如VBS脚本)
我将此方法用于服务器方案,其中同一EXE的多个副本始终在不同时间生成,有些则长达24小时。我不能杀死衍生的副本,因为它会阻止它的工作,但我希望新代码适用于所有新的运行实例。在这种情况下,旧文件的“删除”需要是容错的,因为许多重命名的文件仍在使用中。
答案 2 :(得分:0)
您可能需要查看ClickOnce技术。它专门用于处理这个确切的要求:
http://msdn.microsoft.com/en-us/library/s5tdc033(v=vs.80).aspx
它依赖于应用程序是使用ClickOnce安装程序创建的,但如果是,您只需执行此操作即可获得最新版本的应用程序:
Sub UpdateApplication()
If My.Application.IsNetworkDeployed Then
My.Application.Deployment.Update()
End If
End Sub
答案 3 :(得分:0)
您是否考虑过ClickOnce部署? http://msdn.microsoft.com/en-us/library/t71a733d%28VS.80%29.aspx
它会处理您尝试在此处介绍的这些自动更新。请注意安全限制,但它可以为您节省大量时间。
现在,在我想手动处理此问题的情况下,我通常会有一个单独的可执行文件来处理更新。 这样,您可以关闭应用程序以更新并启动更新程序。 并且为了避免与更新程序本身相同的问题(不是最新的),实际应用程序将在执行之前更新更新程序。这样你就可以保证任何事情都可以更新,所有事情都会最新。
答案 4 :(得分:0)
using System.IO;
// C# (Copy Files)
File.Copy(File_From, File_To);
OR
// C# (Move Files)
File.Move(File_From, File_To);
以下是其中一个可重复的函数:
Using System.IO;
Public Class FileOperation
{
public void MoveFile(from_file, to_file)
{
try
{
System.IO.File.Move(from_file, to_file);
}
catch(Exception ex)
{
string message = "Error In Move";
debug(ex, message);
}
}
public void CopyFile(from_file, to_file)
{
try
{
System.IO.File.Copy(from_file, to_file);
}
catch(Exception ex)
{
string message = "Error In Copy";
debug(ex, message);
}
}
public void DeleteFile(delete_file)
{
try
{
System.IO.File.Delete(delete_file);
}
catch(Exception ex)
{
string message = "Error In Delete";
debug(ex, message);
}
}
public void debug(Exception ex, string message)
{
Console.Write(message+/n+ex.data);
}
}
在您的应用程序调用中:
FileOperation.MoveFile("c:\movethisfile.txt","d:\movethisfile.txt");
或者至少与此类似。