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 OS に関する質問です。他の展開方法が適切な選択ではない、いくつかの非常にカスタムなシナリオで展開を行う前に、この問題に遭遇しました。

使用中のファイルは削除できません: 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 に答える