2

嘿,我一直在尝试制作一个批处理脚本来实现到我的 VB.NET 应用程序中。我的应用程序所做的是检查是否有新版本可用,如果有,它将下载到应用程序数据文件中。然后它创建一个批处理脚本,运行它并自行关闭。

批处理脚本从这里获取更新的版本,获取并替换过时的版本。批处理脚本将运行更新版本(因为它已被移动,它将与过时版本位于同一目录中)并运行它。然后批处理文件将自毁。我试过这样做,但它所做的只是运行新版本,就是这样。它甚至没有自毁?这是我的批处理脚本:

@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")
4

5 回答 5

1

如果您已经使用.NET - 并让它执行创建一个批处理......您也可以,只做批处理。如果您将它用作能够进行传统文件复制的网关......那么您做错了。

使用以下命令代替批处理命令:

System.IO.File.Copy(SourceFile, DestinationFolder, true);

这将覆盖现有文件并完成。

注意用于复制的 Powershell 脚本:

Copy-Item c:\scripts\test.txt c:\test
于 2012-11-04T21:40:38.903 回答
1

这基本上是一个 Windows 操作系统问题。在其他部署方法不适合选择的一些非常自定义的场景中进行部署之前,我遇到了这个问题。

您不能删除正在使用的文件:TRUE

您不能重命名正在使用的文件:FALSE

您可以重命名正在运行和使用文件的 .NET EXE 使用的任何 EXE 或 DLL文件(可能在许多其他场景中)

你能做的就是这个。

1) 使用一些常见但可检测的前缀或后缀重命名程序文件夹中的所有文件。例如“ShadowCopy_TIMESTAMP_ORIGINALFILE.EXT”,您使用时间戳来确保文件名的唯一性。

2)将所有新文件复制到目录中,因为它们已重命名,所以不会发生冲突。

3) 使用刚刚创建的新 EXE 重新启动您的应用程序。

4) 在应用程序启动时,在后台线程中运行一个例程,等待几秒钟并删除所有具有“ ShadowCopy_* ”模式的文件,以执行不需要的文件的清理。

(您可以直接在 .NET 应用程序中执行此操作,或者使用其他更易于处理文件的语言(例如 VBS 脚本)执行此操作)

我将这种方法用于服务器场景,在该场景中,同一 EXE 的多个副本始终在不同时间产生,有些运行时间长达 24 小时。我无法杀死生成的副本,因为它会阻止它完成工作,但我希望新代码适用于所有新运行的实例。在这种情况下,旧文件的“删除”需要容错,因为许多重命名的文件仍在使用中。

于 2013-02-15T03:30:32.720 回答
0
using System.IO;

// C# (Copy Files)
File.Copy(File_From, File_To);

或者

// 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");

或者至少与此类似。

于 2012-11-04T21:21:01.580 回答
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
于 2012-11-04T21:14:25.667 回答
0

您是否研究过 ClickOnce 部署? http://msdn.microsoft.com/en-us/library/t71a733d%28VS.80%29.aspx

它处理您试图在此处介绍的这些自动更新。请注意安全限制,但它可以为您节省大量时间。

现在,在我想手动处理的情况下,我通常会有一个单独的可执行文件来处理更新。这样,您可以关闭应用程序进行更新并启动更新程序。并且为了避免更新程序本身出现相同的问题(不是最新的),实际的应用程序将在执行之前更新更新程序。这样你就可以保证任何东西都可以更新,并且最终都是最新的。

于 2012-11-04T21:15:04.880 回答