0

私はアプリケーションを書いたことがないので、コード全体 (80 行) を投稿します。(私はスクリプトをまとめるバックグラウンドから来ました。)

私の目標は、「使用されている」ポートのリストをロードまたは作成し、リストにない範囲内の番号を選択し、未使用のポートに到達しようとする回数が 129 に達した場合、Windows バッチ ファイルを実行することです。 .

これにより、選択したポートも .cmd に変わります

(これの一部は、SO からのソースの融合です)

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Diagnostics;
using System.IO;
namespace randomport
{
    class Core
    {
        public const int 
            minval = 8001,
            maxval = 8128;
        public static int[] usedPorts = new int[]{};
        public static int 
            chosenPort = 0,
            tries = 0,
            timeout = 10;
        public static bool read = false;
        public static void Main()
        {
            if(!read)
            {
                Read();
                read = true;
            }
            RandGen();
        }
        public static void RandGen()
        {
            Process proc = null;
            Random rand = new Random();
            if(tries < 129) chosenPort = rand.Next(minval, maxval);
            else
            {
                proc.StartInfo.FileName                 = @"C:\Users\Administrator\Desktop\TerrariaServer\filebin\sendservfull.bat";
                proc.StartInfo.RedirectStandardError    = true;
                proc.StartInfo.RedirectStandardOutput   = true;
                proc.StartInfo.UseShellExecute          = false;

                proc.Start();

                proc.WaitForExit
                    (
                        (timeout <= 0)
                        ? int.MaxValue : timeout * 100 * 60
                    );
            }
            for(int i = 0; i < usedPorts.Length; i++)
            {
                if(chosenPort != usedPorts[i])
                {
                    Write();
                //  Application.Exit();
                }
                else
                {
                    tries += 1;
                    return;
                }
            }
        }
        public static void Read()
        {
            using (StreamReader sr = new StreamReader(@"C:\Users\Administrator\Desktop\TerrariaServer\filebin\activeports.txt")) 
            {
                string[] values = sr.ReadToEnd().Split(';');
                for(int i = 0; i < values.Length; i++)
                {
                    int.TryParse(values[i], out usedPorts[i]);
                }
            }
        }
        public static void Write()
        {
            File.AppendAllText(@"C:\Users\Administrator\Desktop\TerrariaServer\filebin\activeports.txt", "set port="+chosenPort+";");
            File.Move(@"C:\Users\Administrator\Desktop\TerrariaServer\filebin\activeports.txt", Path.ChangeExtension(@"C:\Users\Administrator\Desktop\TerrariaServer\filebin\activeports.txt", ".cmd"));
        }
    }
}

最終的なエクスポートで少し作業が必要です (「;」の削除など)。

スクリプトはコンパイルされますが、意図したとおりに実行されません。何かが間違いなく間違っていますが、私はそれに気づいていません。当たり前のことなら便利だと思いますし、単純なフォーマットなどだったらもう少し勉強が必要です。

4

1 に答える 1

0

今回はVisual Studio 2008 Expressでコンパイルし、クリーンアップしました。かっこの欠落など、デバッガーがないと何が問題なのかを判断するのは困難でした。

ファイルの書き込み、コンパイル、およびクラッシュが解決されました..

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Diagnostics;
using System.IO;
namespace randomport
{
    class Core
    {
        public static int[] usedPorts = new int[] { };
        public static int
            minval = 8001,
            maxval = 8129,
            chosenPort = 0,
            timeout = 10,
            temp = 1024;
        public static bool read = false;
        public static void Main(string[] args)
        {
            string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
            if (!Directory.Exists(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt")))
            {
                Directory.CreateDirectory(String.Concat(path, "\\desktop\\TerrariaServer\\filebin"));
                //  using (StreamWriter sw = File.CreateText(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt"))) { }
            }
            if (!Directory.Exists(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\chosenport.cmd")))
            {
                Directory.CreateDirectory(String.Concat(path, "\\desktop\\TerrariaServer\\filebin"));
                using (StreamWriter sw = File.CreateText(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\chosenport.cmd"))) { }
            }
            if (args.Length > 0)
            {
                if (args[0] == "-noread")
                {
                }
                else if (args[0] == "-read" || args[0] == "-default")
                {
                    if (!read)
                    {
                        Read();
                        read = true;
                    }
                }
            }
            else
            {
                if (!read)
                {
                    Read();
                    read = true;
                }
            }
            if (args.Length >= 3)
            {
                if (args[1] != "-default" || args[1] != "0")
                {
                    int.TryParse(args[1], out temp);
                    if (temp > 1024 && temp < 65535)
                    {
                        minval = temp;
                    }
                }
                if (args[2] != "-default" || args[2] != "0")
                {
                    int.TryParse(args[2], out temp);
                    if (temp > 1024 && temp < 65535)
                    {
                        maxval = temp;
                    }
                }
            }
            RandGen();
        }
        public static void RandGen()
        {
            string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
            Random rand = new Random();
            chosenPort = rand.Next(minval, maxval);
            for (int i = 0; i < usedPorts.Length; i++)
            {
                if (chosenPort != usedPorts[i])
                {
                    Write();
                }
                else return;
            }
        }
        public static void Read()
        {
            string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
            if (!File.Exists(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt")))
            {
                File.Create(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt"));
            }
            using (StreamReader sr = new StreamReader(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt")))
            {
                string[] values = sr.ReadToEnd().Split(';');
                usedPorts = new int[values.Length];//Initialize the array with the same length as values
                for (int i = 0; i < values.Length; i++)
                {
                    int.TryParse(values[i], out usedPorts[i]);
                }
            }
        }
        public static void Write()
        {
            string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
            File.AppendAllLines(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\activeports.txt"), new string[] { chosenPort + ";" });
            using (StreamWriter sw2 = File.CreateText(String.Concat(path, "\\desktop\\TerrariaServer\\filebin\\chosenport.cmd")))
            {
                sw2.WriteLine("set port=" + chosenPort);
            }
            Environment.Exit(0);
        }
    }
}
于 2013-10-05T08:11:30.400 に答える