トップページに戻る    C#メモ    C# LINQメモ

C#で作ったツール(コンソールアプリ)


目次

WPFで作った、7-10 開発用ランチャー君から起動したりします。

■■■データ移行■■■
A01. WordPressのxmlを読み込み
■■■設計■■■
B01. Excelファイルの各シートの内容を2次元配列に設定するクラス
■■■製造■■■
C01. 指定サイズのpngファイルに指定文字を記載
C02. 指定サイズのjpgファイル作成
C03. ランダム文字列作成
C04. 指定フォルダの各ファイル名に指定文字を付与して読取専用に
C05. コマンドライン引数のフォルダのバックアップ作成
C06. 2つのフォルダの相互ショートカット作成
C07. MySQL起動 (mysqld.exeが動作中でなければ起動し、mysql.exeを起動)
C08. クリップボートのテキストを指定した正規表現でファイルに分割
■■■単体テスト■■■
D01. 整数と日付の連番作成
D02. フレームワークhtmlチェック
D03. レスポンスhtmlチェック
D04. ローカルPHPチェック
■■■総合テスト■■■
E01. 指定フォルダのPHPファイルをlint
E02. sitemap.xmlからテストコマンド作成
E03. イレギュラーURLのテストバッチ作成
E04. ローカルファイルのチェックバッチ作成
E05. aタグ、imgタグなどの404チェック
■■■デプロイ■■■
F01. フルパスリストから違うフォルダにコピー
F02. WinScpのcdとlcdとputのコマンドリスト作成
F03. WinScpのlcdとputのコマンドリストからフルパスリスト作成
■■■サクラエディタ用■■■
G01. サクラエディタのマクロ選択
■■■ランチャー■■■
H01. 開発用ランチャー君
■■■共通クラス■■■
Z01. ドメイン名からユーザとパスワードを返すクラス

英語名称の一覧
B01 ClassExcelRead
C01 SkypeIcon
C02 NoImage
C03 RandStr
C04 SampleCopy
C05 FolderBackUp
C06 SougoLink
C07 MySQLKidou
C08 TextSplit
D01 Renban
D02 FrameworkCheck
D03 ResponseHtmlCheck
D04 LocalPHPCheck
E01 PHPLint
E02 SitemapRead
E03 RedirectCheck
E04 LocalFileCheck
E05 Check404
F01 DeployList
F02 CreateWinScpPutCommand
F03 ExtractFullPathList
G01 SakuraMacroSelector
H01 Launcher
Z01 DeriveUserPassFromDomain


A01 WordPressのxmlを読み込み

VS Expressから使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        ReadXML(@"D:xmlfilepath.xml");
    }

    //xmlのパスを引数として、xmlを読み込み
    static void ReadXML(string pXMLFilePath)
    {
        var xml = XDocument.Load(pXMLFilePath);

        XElement rows_rss = xml.Element("rss");
        IEnumerable<XElement> rows_channel = rows_rss.Elements("channel");

        IEnumerable<XElement> rows_item = rows_channel.Elements("item");
        foreach (XElement EachElement in rows_item)
        {
            XElement element_title = EachElement.Element("title");
            XElement element_date = EachElement.Element("pubDate");

            var xmlNs1 = XNamespace.Get("http://purl.org/rss/1.0/modules/content/");
            XElement element_encoded = EachElement.Element(xmlNs1 + "encoded");
            string wkEncoded = element_encoded.Value;

            var xmlNs2 = XNamespace.Get("http://wordpress.org/export/1.2/");
            XElement element_wp_date = EachElement.Element(xmlNs2 + "post_date");
            string wkDate = element_wp_date.Value.Substring(0, 10);
        }
    }
}


B01 Excelファイルの各シートの内容を2次元配列に設定するクラス

別のsolutionで使用するクラス
Microsoft Excel ??.? Object LibraryのCOMを参照に追加する必要あり

■■■Program.cs■■■
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    const string ExcelFileFullPath = @"読み込むExcelファイルのフルパス";

    static void Main()
    {
        ClassExcelRead InsExcelRead = new ClassExcelRead(ExcelFileFullPath, true);

        //読み込んだExcelの情報
        List<ClassExcelRead.ExcelInfo> ExcelInfoList = InsExcelRead.GetExcelInfoList();

        string[,] mDataArr = ExcelInfoList.First().DataArr;
        int UB_X = mDataArr.GetUpperBound(0);
        int UB_Y = mDataArr.GetUpperBound(1);

        for (int Y = 0; Y <= UB_Y; Y++) {
            for (int X = 0; X <= UB_X; X++) {
                Console.WriteLine(@"DataArr[{0},{1}] = ""{2}""", X, Y, mDataArr[X, Y]);
            }
        }
    }
}

■■■ClassExcelRead.cs■■■
using System;
using Microsoft.Office.Interop.Excel;
using System.Collections.Generic;

class ClassExcelRead
{
    internal readonly bool mUseStub;

    internal struct ExcelInfo
    {
        internal string SheetName;
        internal string[,] DataArr;
    }

    private List<ExcelInfo> mExcelInfoList = new List<ExcelInfo>();
    private string mExcelFileFullPath;

    // コンストラクタ
    internal ClassExcelRead(string pExcelFileFullPath, bool pUseStub)
    {
        mUseStub = pUseStub;
        if (mUseStub) return; //スタブを使う場合
        mExcelFileFullPath = pExcelFileFullPath;
        ReadExcel();
    }

    //Excelファイルを読み込む
    private void ReadExcel()
    {
        Application xlApp = new Application();
        Workbooks xlBooks = xlApp.Workbooks;
        Workbook xlBook = xlBooks.Open( // C#4.0 から、Type.Missingは省略可
            mExcelFileFullPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing
        );

        Sheets xlSheets = xlBook.Worksheets;
        int SheetCnt = xlSheets.Count;

        for (int I = 1; I <= SheetCnt; I++) {
            ExcelInfo WillAdd;
            Worksheet xlSheet = (Worksheet)xlSheets[I];
            WillAdd.SheetName = xlSheet.Name; //シート名

            Range UsedRange = xlSheet.UsedRange;
            Range UsedRangeRows = UsedRange.Rows;
            int RowCount = UsedRangeRows.Count;
            Range UsedRangeColumns = UsedRange.Columns;
            int ColumnCount = UsedRangeColumns.Count;

            System.Runtime.InteropServices.Marshal.ReleaseComObject(UsedRangeColumns);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(UsedRangeRows);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(UsedRange);

            int UB_X = ColumnCount - 1;
            int UB_Y = RowCount - 1;
            string[,] DataArr = new string[UB_X + 1, UB_Y + 1];

            Range xlRange = xlSheet.Cells;
            for (int Y = 1; Y <= RowCount; Y++) {
                for (int X = 1; X <= ColumnCount; X++) {
                    Range xlCells = (Range)xlRange[Y, X];
                    DataArr[X - 1, Y - 1] = xlCells.Text.ToString();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells);
                }
            }
            WillAdd.DataArr = DataArr;
            mExcelInfoList.Add(WillAdd);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
        }

        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);

        xlBook.Close(Type.Missing, Type.Missing, Type.Missing);  // C#4.0 から、Type.Missingは省略可
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);

        xlApp.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
    }

    //読み込んだExcelの情報を返す
    internal List<ExcelInfo> GetExcelInfoList()
    {
        //スタブを使う場合
        if (mUseStub == false) return mExcelInfoList;

        List<ExcelInfo> stubList = new List<ExcelInfo>();
        ExcelInfo WillAdd;
        WillAdd.SheetName = "シート1";

        WillAdd.DataArr = new string[2, 3];
        WillAdd.DataArr[0, 0] = "1行目1列目の値";
        WillAdd.DataArr[0, 1] = "1行目2列目の値";
        WillAdd.DataArr[0, 2] = "1行目3列目の値";
        WillAdd.DataArr[1, 0] = "2行目1列目の値";
        WillAdd.DataArr[1, 1] = "2行目2列目の値";
        WillAdd.DataArr[1, 2] = "2行目3列目の値";

        stubList.Add(WillAdd);
        return stubList;
    }
}


C01 指定サイズのpngファイルに指定文字を記載

VS Expressから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Drawing;

class Program
{
    const int Haba_X = 100;
    const int Haba_Y = 100;
    const int FontSize = 24;
    const string WriteStr1 = "1行目";
    const string WriteStr2 = "2行目";

    const string PngFileOutFolder = @"作成先フォルダのフルパス";

    static void Main()
    {
        string NowDate = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒");
        string FileName = string.Format("{0}.png", NowDate);

        string PngFileFullPath = System.IO.Path.Combine(PngFileOutFolder, FileName);

        using (var InsBitmap = new Bitmap(Haba_X, Haba_Y))
        using (var InsGraphics = Graphics.FromImage(InsBitmap)) {

            //白で埋める
            InsGraphics.FillRectangle(Brushes.White, 0, 0, Haba_X, Haba_Y);

            using (var InsFont = new Font("MS UI Gothic", FontSize)) {
                InsGraphics.DrawString(WriteStr1, InsFont, Brushes.Black, 0, 0);
                InsGraphics.DrawString(WriteStr2, InsFont, Brushes.Black, 0, Haba_Y / 2);
            }

            InsBitmap.Save(PngFileFullPath, System.Drawing.Imaging.ImageFormat.Png);
            System.Diagnostics.Process.Start(@"mspaint.exe", PngFileFullPath);
        }
    }
}


C02 指定サイズのjpgファイル作成

VS Expressから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Drawing;

class Program
{
    static string mColor;

    const int Haba_X = 480;
    const int Haba_Y = 700;

    //const string JpegFileOutFolder = @"作成先フォルダのフルパス";

    static void Main()
    {
        mColor = "青";
        //mColor = "空色";
        //mColor = "緑";
        //mColor = "オレンジ";
        //mColor = "紫";

        string NowDate = DateTime.Now.ToString("yyyy年MM月dd日");
        string FileName = string.Format("{0}-{1}_{2}.jpg", NowDate, Haba_X, Haba_Y);

        string JpegFileFullPath = System.IO.Path.Combine(JpegFileOutFolder, FileName);

        using (var InsBitmap = new Bitmap(Haba_X, Haba_Y))
        using (var InsGraphics = Graphics.FromImage(InsBitmap)) {

            //白で埋める
            InsGraphics.FillRectangle(Brushes.White, 0, 0, Haba_X, Haba_Y);

            //外枠を埋める
            using (Pen InsPen = new Pen(GetColor(), 18)) {
                InsGraphics.DrawRectangle(InsPen, 0, 0, Haba_X, Haba_Y);
            }

            using (var InsFont = new Font("MS UI Gothic", 72)) {
                InsGraphics.DrawString(Haba_X.ToString(), InsFont, GetBrushes(), Haba_X / 3, Haba_Y / 3);
                InsGraphics.DrawString("×", InsFont, GetBrushes(), Haba_X / 60 * 23, Haba_Y / 2);
                InsGraphics.DrawString(Haba_Y.ToString(), InsFont, GetBrushes(), Haba_X / 3, Haba_Y / 3 * 2);
            }

            InsBitmap.Save(JpegFileFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            System.Diagnostics.Process.Start(@"mspaint.exe", JpegFileFullPath);
        }
    }

    static Color GetColor()
    {
        if (mColor == "青") return Color.Blue;
        if (mColor == "空色") return Color.SkyBlue;
        if (mColor == "緑") return Color.SpringGreen;
        if (mColor == "オレンジ") return Color.DarkOrange;
        return Color.DarkViolet; // 紫
    }

    static Brush GetBrushes()
    {
        if (mColor == "青") return Brushes.Blue;
        if (mColor == "空色") return Brushes.SkyBlue;
        if (mColor == "緑") return Brushes.SpringGreen;
        if (mColor == "オレンジ") return Brushes.DarkOrange;
        return Brushes.DarkViolet; // 紫
    }
}


C03 ランダム文字列作成

エクスプローラから使用

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program
{
    const int RandStrCnt = 30;
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    static void Main()
    {
        var WriteStrList = new List<string>();
        for (int I = 1; I <= RandStrCnt; I++) {
            string PassWord = System.Web.Security.Membership.GeneratePassword(50, 0);
            PassWord = Regex.Replace(PassWord, "[^a-zA-Z0-9]+", "");
            if (PassWord.Length <= 15) continue;
            PassWord = PassWord.Substring(0, 15);
            WriteStrList.Add(PassWord);
        }

        //テキストファイルに保存
        string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") + ".txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


C04 指定フォルダの各ファイル名に指定文字を付与して読取専用に

VS Expressから使用

using System.IO;

class Program
{
    static string mTargetFolder = @"対象のフォルダ";
    const string AddStr = @"●付与したい文字列1●";
    //const string AddStr = @"★付与したい文字列2★";

    static void Main()
    {
        //\で終わっていたら、\を削除
        if (mTargetFolder.EndsWith(@"\")) {
            mTargetFolder = mTargetFolder.Substring(0, mTargetFolder.Length - 1);
        }

        string[] FullPathArr = Directory.GetFiles(mTargetFolder, "*");

        foreach (string CopyMotoFullPath in FullPathArr) {
            string ext = Path.GetExtension(CopyMotoFullPath);

            if (ext != ".html" && ext != ".php") {
                continue;
            }
            string FileName = Path.GetFileName(CopyMotoFullPath);
            if (FileName.Contains("●")) continue;
            if (FileName.Contains("★")) continue;

            string WithoutExtension = Path.GetFileNameWithoutExtension(CopyMotoFullPath);
            string DirectoryPath = Path.GetDirectoryName(CopyMotoFullPath);

            string CopySakiFullPath = Path.Combine(DirectoryPath, WithoutExtension);
            CopySakiFullPath += AddStr + ext;

            if (File.Exists(CopySakiFullPath)) {
                // 読み取り専用を解除
                FileAttributes attr1 = File.GetAttributes(CopySakiFullPath);
                File.SetAttributes(CopySakiFullPath, attr1 & (~FileAttributes.ReadOnly));
            }

            File.Copy(CopyMotoFullPath, CopySakiFullPath, true);

            // 読み取り専用を設定
            FileAttributes attr2 = File.GetAttributes(CopySakiFullPath);
            File.SetAttributes(CopySakiFullPath, attr2 | FileAttributes.ReadOnly);
        }
    }
}


C05 コマンドライン引数のフォルダのバックアップ作成

エクスプローラから使用
Microsoft.VisualBasic.dllを参照設定する必要あり
System.Windows.Formsを参照設定する必要あり

using System;
using System.IO;
using System.Windows.Forms;

class Program
{
    static void Main(string[] args)
    {
        string CopyMotoFolderFullPath = "";
        if (args.Length > 0) {
            CopyMotoFolderFullPath = args[0];
        }
        else {
            MessageBox.Show("コマンドライン引数がありません");
            return;
        }
        
        //\で終わっていたら、\を削除
        if (CopyMotoFolderFullPath.EndsWith(@"\")){
            CopyMotoFolderFullPath = CopyMotoFolderFullPath.Substring(0, CopyMotoFolderFullPath.Length - 1);
        }

        if (Directory.Exists(CopyMotoFolderFullPath) == false) {
            MessageBox.Show(string.Format("コピー元フォルダ{0}が存在しません", CopyMotoFolderFullPath));
            return;
        }

        string CopyMotoFolderName = System.IO.Path.GetFileName(CopyMotoFolderFullPath);
        string ParentFolderFullPath = System.IO.Directory.GetParent(CopyMotoFolderFullPath).FullName;

        string NowStr = DateTime.Now.ToString("yyyy-MM-dd-HH-mm");
        string CopySakiFolderName = string.Format("{0}-BackUp-{1}", CopyMotoFolderName, NowStr);
        string CopySakiFolderFullPath = System.IO.Path.Combine(ParentFolderFullPath, CopySakiFolderName);

        if (Directory.Exists(CopySakiFolderFullPath)) {
            MessageBox.Show(string.Format("コピー先フォルダ{0}が既に存在します", CopySakiFolderFullPath));
            return;
        }
        System.IO.Directory.CreateDirectory(CopySakiFolderFullPath);

        Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
            CopyMotoFolderFullPath, CopySakiFolderFullPath,
            Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
            Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
    }
}


C06 2つのフォルダの相互ショートカット作成

VS Expressから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

class Program
{
    static string mShortCutSakiFolder1 = @"ショートカット先1";
    static string mShortCutSakiFolder2 = @"ショートカット先2";

    // ショートカット先を引数にして、ショートカット名を返す
    static string DeriveShortCutName(string pShortCutSaki)
    {
        string WillReturn = "DefaultShortCutName.lnk";
        return WillReturn;
    }

    static void Main(string[] args)
    {
        try {
            //コマンドライン引数があれば優先して使用する
            if (args.Length == 2) {
                mShortCutSakiFolder1 = args[0];
                mShortCutSakiFolder2 = args[1];
            }
            //行末が\でない場合は補完
            if (mShortCutSakiFolder1.EndsWith(@"\") == false) mShortCutSakiFolder1 += @"\";
            if (mShortCutSakiFolder2.EndsWith(@"\") == false) mShortCutSakiFolder2 += @"\";

            var WriteStrList = new List<string>();
            WriteStrList.AddRange(DeriveVBScript(1, mShortCutSakiFolder1, mShortCutSakiFolder2));
            WriteStrList.Add("");
            WriteStrList.AddRange(DeriveVBScript(2, mShortCutSakiFolder2, mShortCutSakiFolder1));
            WriteStrList.Add(@"msgbox ""Success Result""");

            //テキストファイルに保存
            string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") + ".txt";
            string SaveFullPath = Path.Combine(getWorkFolder(), FileName);
            File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

            //VBScriptを実行
            var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
            InsProcessStartInfo.FileName = "wscript";
            InsProcessStartInfo.Arguments = "//E:VBScript " + SaveFullPath;
            InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
            System.Diagnostics.Process.Start(InsProcessStartInfo);
        }
        catch (Exception ex) {
            MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace);
        }
    }

    //変数の接尾の数字、ショートカット作成パス、リンク先を引数として、VBScriptを返す
    static List<string> DeriveVBScript(int pI, string pLinkMoto, string pLinkSaki)
    {
        var WillReturn = new List<string>();

        string ShortCutDirectory = Path.GetDirectoryName(pLinkMoto);
        string ShortCutFullPath = Path.Combine(ShortCutDirectory, DeriveShortCutName(pLinkSaki));
        string TargetDirectory = Path.GetDirectoryName(pLinkSaki);

        string wkStr;
        wkStr = string.Format(@"Set objShell{0} = WScript.CreateObject(""WScript.Shell"")", pI);
        WillReturn.Add(wkStr);

        wkStr = string.Format(@"Set objShortCut{0} = objShell{0}.CreateShortcut(""{1}"")",
                              pI, ShortCutFullPath);
        WillReturn.Add(wkStr);

        wkStr = string.Format(@"objShortCut{0}.TargetPath = ""{1}""",
                              pI, TargetDirectory);
        WillReturn.Add(wkStr);

        wkStr = string.Format(@"objShortCut{0}.Save", pI);
        WillReturn.Add(wkStr);

        return WillReturn;
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


C07 MySQL起動 (mysqld.exeが動作中でなければ起動し、mysql.exeを起動)

using System;

class Program
{
    //mysqldプロセス開始の、バッチファイルのショートカットのパス
    const string mysqld_Start = @"D:\MySQL5.5\mysqldプロセス開始.bat.lnk";

    //mysqlコマンドプロンプトの起動の、バッチファイルのショートカットのパス
    const string mysql_Kidou = @"D:\MySQL5.5\mysqlコマンドプロンプトの起動.bat.lnk";

    static void Main()
    {
        while (true) {
            bool WillBreak = false;

            var ProcessArr = System.Diagnostics.Process.GetProcesses();
            foreach (var EachProcess in ProcessArr) {
                if (EachProcess.ProcessName == "mysqld") {
                    WillBreak = true;
                }
            }
            if (WillBreak) break;

            var InsProcessStartInfo1 = new System.Diagnostics.ProcessStartInfo();
            InsProcessStartInfo1.FileName = mysqld_Start;
            System.Diagnostics.Process.Start(InsProcessStartInfo1);

            System.Threading.Thread.Sleep(3000);
        }
        var InsProcessStartInfo2 = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo2.FileName = mysql_Kidou;
        System.Diagnostics.Process.Start(InsProcessStartInfo2);
    }
}


C08 クリップボートのテキストを指定した正規表現でファイルに分割

VS Expressから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class Program
{
    //分割するテキストファイルの最後の行のマッチパターン
    const string SplitRegex = @"^.*</li>.*$";

    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    [STAThreadAttribute]
    static void Main()
    {
        string ClipboardText = GetClipboard();

        var InsStringReader = new System.IO.StringReader(ClipboardText);

        var LineDataList = new List<string>();
        while (InsStringReader.Peek() > -1) {
            LineDataList.Add(InsStringReader.ReadLine());
        }

        string NowStr = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒");
        var WriteStrList = new List<string>();
        var FileHashSet = new HashSet<string>();
        int OutFileCnt = 0;

        for (int I = 0; I <= LineDataList.Count - 1; I++) {
            WriteStrList.Add(LineDataList[I]);

            bool IsEnd = false;
            if (Regex.IsMatch(LineDataList[I], SplitRegex)) {
                IsEnd = true;
            }
            if (I == LineDataList.Count - 1) {
                IsEnd = true;
            }
            if (IsEnd == false) continue;

            string CurrHash = DeriveHash(WriteStrList);
            if (FileHashSet.Add(CurrHash)) {
                // 出力するファイル名
                string OutFileName = string.Format("{0}-TextSplit{1}.txt", NowStr, ++OutFileCnt);
                string OutFilePath = System.IO.Path.Combine(getWorkFolder(), OutFileName);

                //テキストファイルに保存
                System.IO.File.WriteAllLines(OutFilePath, WriteStrList.ToArray());

                //テキストファイルを開く
                var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
                InsProcessStartInfo.FileName = PathEditor;
                InsProcessStartInfo.Arguments = OutFilePath;
                InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
                System.Diagnostics.Process p = System.Diagnostics.Process.Start(InsProcessStartInfo);
                p.WaitForInputIdle();
            }
            WriteStrList.Clear();
        }
    }

    //クリップボートのテキストデータを返す
    static string GetClipboard()
    {
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
            return iData.GetData(DataFormats.Text).ToString();
        return "";
    }

    //テキストファイルに出力する内容のハッシュ値を返す
    static string DeriveHash(List<string> pWriteStrList)
    {
        var sb = new StringBuilder();
        pWriteStrList.ForEach(pX => sb.AppendLine(pX));
        return sb.ToString();
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


D01 整数と日付の連番作成

エクスプローラから使用

using System;
using System.Collections.Generic;

class Program
{
    const int RenbanLimit = 300;
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    static void Main()
    {
        var WriteStrList = new List<string>();
        for (int I = 1; I <= RenbanLimit; I++) {
            WriteStrList.Add(I.ToString().PadLeft(RenbanLimit.ToString().Length, '0'));
        }
        for (int I = RenbanLimit; 1 <= I; I--) {
            WriteStrList.Add(I.ToString().PadLeft(RenbanLimit.ToString().Length, '0'));
        }
        for (int I = -RenbanLimit / 2; I <= RenbanLimit / 2; I++) {
            var CurrDay = DateTime.Now;
            CurrDay = CurrDay.AddDays(I);
            WriteStrList.Add(CurrDay.ToString(@"yyyy\/MM\/dd"));
        }

        //テキストファイルに保存
        string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") + ".txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


D02 フレームワークhtmlチェック

コマンドプロンプトから使用

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

class Program
{
    static string mTargetFileFullPath = @"チェック対象のhtmlのフルパス";

    static string[] mLineDataArr;

    static List<string> mWillOutList = new List<string>();

    static void Main(string[] args)
    {
        //コマンドライン引数があれば優先して使用する
        if (args.Length == 1) {
            mTargetFileFullPath = args[0];
        }

        //行単位でListに設定
        mLineDataArr = File.ReadAllLines(mTargetFileFullPath);

        //処理01 チェック1
        //処理02 チェック2
        //処理03 チェック3
        //処理04 チェック4
        //処理05 チェック5
        //処理06 チェック6
        //処理07 行末の空白とタブのチェック
        S07_EndSpaceCheck();

        if (mWillOutList.Count > 0) {
            Console.WriteLine("■■■{0}でエラーあり■■■", mTargetFileFullPath);
            mWillOutList.ForEach(pX => Console.WriteLine(pX));
        }
    }

    // 処理07 行末の空白とタブのチェック
    static void S07_EndSpaceCheck()
    {
        for (int I = 0; I <= mLineDataArr.GetUpperBound(0); I++) {
            if (Regex.IsMatch(mLineDataArr[I], @"(\t| )+$")) {
                mWillOutList.Add(string.Format("{0}行目 {1}に行末空白があります。", I + 1, mLineDataArr[I]));
            }
        }
    }
}


D03 レスポンスhtmlチェック

コマンドプロンプトから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class Program
{
    static string[] GetCheckStrArr()
    {
        var WillReturn = new List<string>();
        WillReturn.Add("チェックしたい文字列");
        return WillReturn.ToArray();
    }

    const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko";

    [STAThreadAttribute]
    static void Main(string[] args)
    {
        // チェックしたい文字列の配列
        string[] CheckStrArr = GetCheckStrArr();

        string TargetURL = "";
        // コマンドライン引数があれば、URLとして使用
        if (args.Length > 0) {
            TargetURL = args[0];
        }
        // コマンドライン引数がなければ、クリップボートのURLを使用
        else {
            TargetURL = GetClipboard();
        }

        // URLの末尾が.htmlでなく/でもない場合は、/を付与
        if (TargetURL.EndsWith(".html") == false && TargetURL.EndsWith("/") == false) {
            TargetURL += "/";
        }

        Console.WriteLine(@"チェック対象のURL {0}", TargetURL);

        string[] HtmlLineDataArr = GetTargetURLHtmlLineDataArr(TargetURL);

        //PHPの文法エラーのチェック
        if (Array.Exists(HtmlLineDataArr, pX => pX.StartsWith("<b>Fatal error</b>:"))) {
            Console.WriteLine("★★★Fatal error有り★★★");
        }
        if (Array.Exists(HtmlLineDataArr, pX => pX.StartsWith("<b>Warning</b>:"))) {
            Console.WriteLine("★★★Warning有り★★★");
        }
        if (Array.Exists(HtmlLineDataArr, pX => pX.StartsWith("<b>Notice</b>:"))) {
            Console.WriteLine("★★★Notice有り★★★");
        }

        bool HasError = false;
        for (int I = 0; I <= HtmlLineDataArr.GetUpperBound(0); I++) {
            string CurrLineStr = HtmlLineDataArr[I];

            foreach (string EachCheckStr in CheckStrArr) {
                if (CurrLineStr.Contains(EachCheckStr)) {
                    string wkStr = Regex.Replace(CurrLineStr, @"^(\\t| )+", "");
                    Console.WriteLine("{0}行目 {1}", I + 1, wkStr);
                    HasError = true;
                    break;
                }
            }
        }
        if (HasError == false) {
            Console.WriteLine("Check OK");
        }
    }

    //クリップボートのURLを返す
    static string GetClipboard()
    {
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
            return iData.GetData(DataFormats.Text).ToString();
        return "";
    }

    //チェック対象のhtmlの行ごとのstring型の配列を返す
    static string[] GetTargetURLHtmlLineDataArr(string pTargetURL)
    {
        var WillReturn = new List<string>();
        try {
            var wc = new System.Net.WebClient();
            wc.Headers.Add("user-agent", UserAgent);

            var Ins_Z01_DriveIDPassFromDomain = new _Z01_DriveIDPassFromDomain(pTargetURL);
            string BasicUser = Ins_Z01_DriveIDPassFromDomain.GetUser();
            string BasicPass = Ins_Z01_DriveIDPassFromDomain.GetPass();

            var namePassword = string.Format("{0}:{1}", BasicUser, BasicPass);
            var chars = System.Text.Encoding.ASCII.GetBytes(namePassword);
            var base64 = Convert.ToBase64String(chars);
            wc.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + base64;

            System.IO.Stream st = wc.OpenRead(pTargetURL);
            var sr = new System.IO.StreamReader(st);

            string Line;
            while ((Line = sr.ReadLine()) != null) {
                WillReturn.Add(Line);
            }
            sr.Close(); wc.Dispose();
        }
        catch (Exception e) {
            Console.WriteLine(e.Message);
        }
        return WillReturn.ToArray();
    }
}


D04 ローカルPHPチェック

コマンドプロンプトから使用

using System;
using System.IO;
using System.Text.RegularExpressions;

class Program
{
    static string mTargetPHPFullPath = @"チェックしたいPHPファイルのフルパス";

    static string[] mLineDataArr;

    static void Main(string[] args)
    {
        //コマンドライン引数があれば優先して使用する
        if (args.Length > 0) {
            mTargetPHPFullPath = args[0];
        }
        Console.WriteLine(@"チェック対象のPHPファイル {0}", mTargetPHPFullPath);

        //行単位で配列に設定
        mLineDataArr = File.ReadAllLines(mTargetPHPFullPath);

        for (int I = 0; I <= mLineDataArr.GetUpperBound(0); I++) {
            // コメントでないecho
            if (Regex.IsMatch(mLineDataArr[I], @"(?<!//.*)echo")) {
                Console.WriteLine("{0}行目 {1} がNG", I + 1, mLineDataArr[I]);
            }

            // コメントでないvar_export
            if (Regex.IsMatch(mLineDataArr[I], @"(?<!//.*)var_export")) {
                Console.WriteLine("{0}行目 {1} がNG", I + 1, mLineDataArr[I]);
            }

            // コメントでないvar_dump
            if (Regex.IsMatch(mLineDataArr[I], @"(?<!//.*)var_dump")) {
                Console.WriteLine("{0}行目 {1} がNG", I + 1, mLineDataArr[I]);
            }

            // else if
            if (mLineDataArr[I].Contains("else if")) {
                Console.WriteLine("{0}行目 {1} がNG", I + 1, mLineDataArr[I]);
            }

            // ifもしくはelseifで、==でない=
            if (Regex.IsMatch(mLineDataArr[I], @"(?<!\$|else| *)if")) {
                if (mLineDataArr[I].Contains("==") == false
                    && mLineDataArr[I].Contains("!=") == false
                    && mLineDataArr[I].Contains("<=") == false
                    && mLineDataArr[I].Contains(">=") == false
                    && mLineDataArr[I].Contains("=")) {
                    Console.WriteLine("{0}行目 {1} がNG", I + 1, mLineDataArr[I]);
                }
            }
        }
    }
}


E01 指定フォルダのPHPファイルをlint

エクスプローラから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

class Program
{
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    static void Main(string[] args)
    {
        string TargetFolderFullPath = "";
        if (args.Length > 0) {
            TargetFolderFullPath = args[0];
        }
        else {
            MessageBox.Show("コマンドライン引数がありません");
            return;
        }

        if (Directory.Exists(TargetFolderFullPath) == false) {
            MessageBox.Show(string.Format("ターゲットフォルダ{0}が存在しません", TargetFolderFullPath));
            return;
        }
        string[] FullPathArr =
            Directory.GetFiles(TargetFolderFullPath, "*.php", SearchOption.AllDirectories);

        var WriteStrList = new List<string>();

        string NowStr = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒");
        string SaveFileName = NowStr + ".txt";
        string LintLogFileName = NowStr + "lintlog.txt";

        string LintLogFullPath = System.IO.Path.Combine(getWorkFolder(), LintLogFileName);
        bool FirstFlag = true;
        foreach (string EachFullPath in FullPathArr) {
            WriteStrList.Add(string.Format("php -l {0} {1} {2}",
                EachFullPath, FirstFlag ? ">" : ">>", LintLogFullPath));
            if (FirstFlag) {
                FirstFlag = false;
            }
        }
        WriteStrList.Add(LintLogFullPath);

        //テキストファイルに保存
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), SaveFileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


E02 sitemap.xmlからテストコマンド作成

コマンドプロンプトから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class Program
{
    const string BasicUser = "Basic認証のユーザ名";
    const string BasicPass = "Basic認証のパスワード";

    const string Check404ExePath = @"Check404ExePathのフルパス";
    const string ResponseHtmlCheckExePath = @"ResponseHtmlCheckのフルパス";

    const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko";
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    [STAThreadAttribute]
    static void Main(string[] args)
    {
        string TargetURL = "";
        // コマンドライン引数があれば、URLとして使用
        if (args.Length > 0) {
            TargetURL = args[0];
        }
        // コマンドライン引数がなければ、クリップボートのURLを使用
        else {
            TargetURL = GetClipboard();
        }

        var WriteStrList = new List<string>();

        WriteStrList.Add("");
        WriteStrList.Add(string.Format(@"rem TargetURL {0}", TargetURL));
        WriteStrList.Add("");

        string[] HtmlLineDataArr = GetTargetURLHtmlLineDataArr(TargetURL);

        var URLList = new List<string>();

        for (int I = 0; I <= HtmlLineDataArr.GetUpperBound(0); I++) {
            string CurrLineStr = HtmlLineDataArr[I];

            if (Regex.IsMatch(CurrLineStr, "<loc>.*?</loc>")) {
                Match InsMatch = Regex.Match(CurrLineStr, @"<loc>(.*?)</loc>");
                URLList.Add(InsMatch.Groups[1].Value);
            }
        }

        string NowStr = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒");

        //コマンドを保存するテキストファイルのフルパス
        string FileName = NowStr + "-SitemapRead.txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);

        //Check404のリダイレクト先のフルパス
        string RedirectFileName1 = NowStr + "-Check404.txt";
        string RedirectFullPath1 = System.IO.Path.Combine(getWorkFolder(), RedirectFileName1);

        //ResponseHtmlCheckのリダイレクト先のフルパス
        string RedirectFileName2 = NowStr + "-ResponseHtmlCheck.txt";
        string RedirectFullPath2 = System.IO.Path.Combine(getWorkFolder(), RedirectFileName2);

        WriteStrList.Add("rem ■■■Check404■■■■■■■■■■■■■■■■■■■■");
        foreach (string EachURL in URLList) {
            WriteStrList.Add(EachURL);
        }
        string Check404Folder = System.IO.Path.GetDirectoryName(Check404ExePath);
        string Check404Name = System.IO.Path.GetFileName(Check404ExePath);

        WriteStrList.Add(string.Format("cd /d {0}", Check404Folder));
        string wkStr1 = string.Format(@"{0} ""{1}"" >> ""{2}""",
                                      Check404Name, SaveFullPath, RedirectFullPath1);
        WriteStrList.Add(wkStr1);
        WriteStrList.Add("");
        WriteStrList.Add(RedirectFullPath1);

        for (int I = 1; I <= 5; I++) WriteStrList.Add("");

        WriteStrList.Add("rem ■■■ResponseHtmlCheck■■■■■■■■■■■■■■■■");
        string ResponseHtmlCheckFolder = System.IO.Path.GetDirectoryName(ResponseHtmlCheckExePath);
        string ResponseHtmlCheckName = System.IO.Path.GetFileName(ResponseHtmlCheckExePath);

        WriteStrList.Add(string.Format("cd /d {0}", ResponseHtmlCheckFolder));

        //URLをコマンドライン引数にしてチェック用のexe起動
        foreach (string EachURL in URLList) {
            string wkStr2 = string.Format(@"{0} ""{1}"" >> ""{2}""",
                                          ResponseHtmlCheckName, EachURL, RedirectFullPath2);
            WriteStrList.Add(wkStr2);
        }
        WriteStrList.Add("");
        WriteStrList.Add(RedirectFullPath2);

        //テキストファイルに保存
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //クリップボートのURLを返す
    static string GetClipboard()
    {
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
            return iData.GetData(DataFormats.Text).ToString();
        return "";
    }

    //チェック対象のhtmlの行ごとのstring型の配列を返す
    static string[] GetTargetURLHtmlLineDataArr(string pTargetURL)
    {
        var WillReturn = new List<string>();
        try {
            var wc = new System.Net.WebClient();
            wc.Headers.Add("user-agent", UserAgent);

            var Ins_Z01_DriveIDPassFromDomain = new _Z01_DriveIDPassFromDomain(pTargetURL);
            string BasicUser = Ins_Z01_DriveIDPassFromDomain.GetUser();
            string BasicPass = Ins_Z01_DriveIDPassFromDomain.GetPass();

            var namePassword = string.Format("{0}:{1}", BasicUser, BasicPass);
            var chars = System.Text.Encoding.ASCII.GetBytes(namePassword);
            var base64 = Convert.ToBase64String(chars);
            wc.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + base64;

            System.IO.Stream st = wc.OpenRead(pTargetURL);
            var sr = new System.IO.StreamReader(st);

            string Line;
            while ((Line = sr.ReadLine()) != null) {
                WillReturn.Add(Line);
            }
            sr.Close(); wc.Dispose();
        }
        catch (Exception e) {
            Console.WriteLine(e.Message);
        }
        return WillReturn.ToArray();
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


E03 イレギュラーURLのテストバッチ作成

VS Expressから使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

class Program
{
    const string BasicUser = "Basic認証のユーザ名";
    const string BasicPass = "Basic認証のパスワード";

    // トップURL
    static string mTopURL = "正規化したトップのURL";

    // Basic認証の付与有無
    const bool WillAddBascic = false;

    //1階層深くなるディレクトリ名の配列
    static string[] mDeepDirectoryNameArr = new string[] { "ディレクトリ名1", "ディレクトリ名2" };

    //ファイル名の末尾に連番を含むURLの配列
    static string[] mHasSeqURLArr =
        new string[] { "ファイル名の末尾に連番を含むURL1",
                       "ファイル名の末尾に連番を含むURL2",
                       "ファイル名の末尾に連番を含むURL3",
                       };

    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    //ドメイン名
    static string mDomainName;

    static void Main()
    {
        //トップURLの末尾の/は削除しておく
        mTopURL = Regex.Replace(mTopURL, "/$", "");

        //トップURLのBasic認証は消しておく
        mTopURL = mTopURL.Replace(string.Format("{0}:{1}@", BasicUser, BasicPass), "");

        //ドメイン名の取得
        mDomainName = Regex.Replace(mTopURL, @"^https?://", "");

        // リダイレクトテストのURLリスト
        var RedirectURLList = new List<string>();

        //処理01 URLListを引数として、http://とhttps://を付与し、Basic認証のID/Passも付与
        RedirectURLList = S01_AddScheme();

        //処理02 RedirectURLListを引数として、www無しドメインと、www有りドメインを付与
        RedirectURLList = S02_AddDomain(RedirectURLList);

        //処理03 RedirectURLListを引数として、トップか1階層のディレクトリを付与
        RedirectURLList = S03_AddDirectory(RedirectURLList);

        //処理04 RedirectURLListを引数として、末尾がスラッシュ有りと無し、index.html、index.php
        RedirectURLList = S04_AddFileName(RedirectURLList);

        //ソート用の文字列でソート
        RedirectURLList = RedirectURLList.OrderBy(pX => DeriveSortString(pX)).ThenBy(pX => pX).ToList();

        //処理05 404リダイレクトテストのURLリストを返す
        var NotFoundURLList = S05_NotFoundURLList();

        var WriteStrList = new List<string>();
        for (int I = 0; I <= RedirectURLList.Count - 1; I++) {

            //ソート用の文字列がBreakしたら、pauseコマンドを出力する
            if (I > 0) {
                string PrevSortString = DeriveSortString(RedirectURLList[I - 1]);
                if (PrevSortString != DeriveSortString(RedirectURLList[I])) {
                    WriteStrList.Add("pause");
                }
            }
            WriteStrList.Add(string.Format(@"start """" ""{0}""", RedirectURLList[I]));
        }

        WriteStrList.Add("pause");
        foreach (string EachNotFoundURL in NotFoundURLList) {
            WriteStrList.Add(string.Format(@"start """" ""{0}""", EachNotFoundURL));
        }

        //テキストファイルに保存
        string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") + ".txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //処理01 RedirectURLListを引数として、http://とhttps://を付与し、Basic認証のID/Passも付与
    static List<string> S01_AddScheme()
    {
        var WillReturn = new List<string>();
        if (WillAddBascic) {
            WillReturn.Add(string.Format("https://{0}:{1}@", BasicUser, BasicPass));
            WillReturn.Add(string.Format("http://{0}:{1}@", BasicUser, BasicPass));
        }
        else {
            WillReturn.Add("https://");
            WillReturn.Add("http://");
        }
        return WillReturn;
    }

    //処理02 RedirectURLListを引数として、www無しドメインと、www有りドメインを付与
    static List<string> S02_AddDomain(List<string> pRedirectURLList)
    {
        var WillReturn = new List<string>();
        foreach (string EachURL in pRedirectURLList) {
            WillReturn.Add(EachURL + mDomainName);
            if (mDomainName.StartsWith("www")) {
                WillReturn.Add(EachURL + Regex.Replace(mDomainName, @"^www\.", ""));
            }
            else {
                WillReturn.Add(EachURL + "www." + mDomainName);
            }
        }
        return WillReturn;
    }

    //処理03 RedirectURLListを引数として、トップか1階層のディレクトリを付与
    static List<string> S03_AddDirectory(List<string> pRedirectURLList)
    {
        var WillReturn = new List<string>();
        foreach (string EachURL in pRedirectURLList) {
            WillReturn.Add(EachURL);
            foreach (string EachDeepDirectoryName in mDeepDirectoryNameArr) {
                WillReturn.Add(URLCombine(EachURL, EachDeepDirectoryName));
            }
        }
        return WillReturn;
    }

    //処理04 RedirectURLListを引数として、末尾がスラッシュ有りと無し、index.html、index.php
    static List<string> S04_AddFileName(List<string> pRedirectURLList)
    {
        var WillReturn = new List<string>();
        foreach (string EachURL in pRedirectURLList) {
            if (EachURL.EndsWith("/")) {
                WillReturn.Add(Regex.Replace(EachURL, "/$", ""));
                WillReturn.Add(EachURL);
            }
            else {
                WillReturn.Add(EachURL + "/");
                WillReturn.Add(EachURL);
            }
            WillReturn.Add(URLCombine(EachURL, "index.html"));
            WillReturn.Add(URLCombine(EachURL, "index.php"));
        }
        return WillReturn;
    }

    //処理05 404リダイレクトテストのURLリストを返す
    static List<string> S05_NotFoundURLList()
    {
        var WillReturn = new List<string>();
        WillReturn.Add(string.Format("{0}/NonExistsFile.html", mTopURL)); //トップ
        WillReturn.Add(string.Format("{0}/aaa/", mTopURL)); //1階層
        WillReturn.Add(string.Format("{0}/aaa/bbb/", mTopURL)); //2階層
        WillReturn.Add(string.Format("{0}/aaa/bbb/ccc/", mTopURL)); //3階層

        //実在するディレクトリで1階層
        foreach (string EachDeepDirectoryName in mDeepDirectoryNameArr) {
            string wkURL1 = URLCombine(mTopURL, EachDeepDirectoryName);
            WillReturn.Add(URLCombine(wkURL1, "NonExistsFile.html"));
        }

        //ファイル名の末尾に連番を含むURL
        foreach (string EachHasSeqURL in mHasSeqURLArr) {
            string wkURL2 = Regex.Replace(EachHasSeqURL, @"[0-9]+(?=\.html$)", "9876");
            WillReturn.Add(wkURL2);
        }
        return WillReturn;
    }

    //URLでSystem.IO.Path.Combine
    static string URLCombine(string pStr1, string pStr2)
    {
        if (pStr1.EndsWith("/")) {
            pStr1 = Regex.Replace(pStr1, "/$", "");
        }
        return string.Format("{0}/{1}", pStr1, pStr2);
    }

    //末尾のindex.html、index.php、/ を削除したソート用文字列を返す
    static string DeriveSortString(string pURL)
    {
        if (pURL.EndsWith("index.html")) pURL = Regex.Replace(pURL, @"index\.html$", "");
        if (pURL.EndsWith("index.php")) pURL = Regex.Replace(pURL, @"index\.php$", "");
        if (pURL.EndsWith("/")) pURL = Regex.Replace(pURL, "/$", "");
        if (pURL.Contains("www.")) pURL = pURL.Replace("www.", "");
        pURL = Regex.Replace(pURL, @"^https?://(www\.)?", "");
        return pURL;
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


E04 ローカルファイルのチェックバッチ作成

●ローカルのディレクトリを引数とし、下記のチェック用のバッチファイル作成 (拡張子はtxt)

ディレクトリ内のhtmlファイルに対し、
・D02 フレームワークhtmlチェック

ディレクトリ内のphpファイルに対し、
・D04 ローカルPHPチェック
・PHPのlint

エクスプローラから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

class Program
{
    const string FrameworkCheckExePath = @"FrameworkCheckExeのフルパス";
    const string LocalPHPCheckExePath = @"LocalPHPCheckExeのフルパス";

    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    static void Main(string[] args)
    {
        string TargetFolderFullPath = "";
        if (args.Length > 0) {
            TargetFolderFullPath = args[0];
        }
        else {
            MessageBox.Show("コマンドライン引数がありません");
            return;
        }

        if (Directory.Exists(TargetFolderFullPath) == false) {
            MessageBox.Show(string.Format("ターゲットフォルダ{0}が存在しません", TargetFolderFullPath));
            return;
        }

        var WriteStrList = new List<string>();

        // htmlファイルのフルパスの配列
        string[] HTMLFullPathArr =
            Directory.GetFiles(TargetFolderFullPath, "*.html", SearchOption.AllDirectories);

        // phpファイルのフルパスの配列
        string[] PHPFullPathArr =
            Directory.GetFiles(TargetFolderFullPath, "*.php", SearchOption.AllDirectories);

        string NowStr = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒");

        //チェック結果のリダイレクト先のファイルのフルパス
        string RedirectFileName = NowStr + "-redirect.txt";
        string RedirectFullPath = System.IO.Path.Combine(getWorkFolder(), RedirectFileName);

        WriteStrList.Add("rem ■■■FrameworkCheck■■■■■■■■■■■■■■■■■■");
        //ファイルのフルパスをコマンドライン引数にしてチェック用のexe起動
        foreach (string EachHTMLFullPath in HTMLFullPathArr) {
            string wkStr = string.Format(@"{0} ""{1}"" >> ""{2}""",
                                           FrameworkCheckExePath, EachHTMLFullPath, RedirectFullPath);
            WriteStrList.Add(wkStr);
        }
        for (int I = 1; I <= 5; I++) WriteStrList.Add("");

        WriteStrList.Add("rem ■■■LocalPHPCheck■■■■■■■■■■■■■■■■■■");
        //ファイルのフルパスをコマンドライン引数にしてチェック用のexe起動
        foreach (string EachPHPFullPath in PHPFullPathArr) {
            string wkStr = string.Format(@"{0} ""{1}"" >> ""{2}""",
                                           LocalPHPCheckExePath, EachPHPFullPath, RedirectFullPath);
            WriteStrList.Add(wkStr);
        }
        for (int I = 1; I <= 5; I++) WriteStrList.Add("");

        WriteStrList.Add("rem ■■■PHP lint■■■■■■■■■■■■■■■■■■■■■■");
        //ファイルのフルパスをコマンドライン引数にしてチェック用のexe起動
        foreach (string EachPHPFullPath in PHPFullPathArr) {
            string wkStr = string.Format(@"php -l ""{0}"" >> ""{1}""",
                                           EachPHPFullPath, RedirectFullPath);
            WriteStrList.Add(wkStr);
        }
        for (int I = 1; I <= 5; I++) WriteStrList.Add("");

        WriteStrList.Add("rem ■■■リダイレクト結果を開く■■■■■■■■■■■■■");
        WriteStrList.Add(RedirectFullPath);

        //テキストファイルに保存
        string SaveFileName = NowStr + ".txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), SaveFileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        //テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);
    }

    //Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


F01 フルパスリストから違うフォルダにコピー

VS Expressから使用

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    // CopyMotoFolder1にファイルが無ければ、
    // CopyMotoFolder2のファイルがコピー元になる
    const string CopyMotoFolder1 = @"コピー元フォルダ1";
    const string CopyMotoFolder2 = @"コピー元フォルダ2";
    const string CopySakiFolder = @"コピー先フォルダ";

    static void Main()
    {
        var RelPathList = new List<string>();
        RelPathList.Add(@"depth0-file.txt");
        RelPathList.Add(@"depth1-folder1\depth1-file1.txt");
        RelPathList.Add(@"depth1-folder2\depth1-file2.txt");

        foreach (string EachRelPath in RelPathList) {
            string CopySakiFullPath = Path.Combine(CopySakiFolder, EachRelPath);

            // コピー先フォルダの作成
            string MakeiFolder = Path.GetDirectoryName(CopySakiFullPath);
            Directory.CreateDirectory(MakeiFolder);

            string CopyMotoFullPath1 = Path.Combine(CopyMotoFolder1, EachRelPath);
            string CopyMotoFullPath2 = Path.Combine(CopyMotoFolder2, EachRelPath);

            // ファイルのコピー
            if (File.Exists(CopyMotoFullPath1)) {
                File.Copy(CopyMotoFullPath1, CopySakiFullPath, true);
            }
            else if (File.Exists(CopyMotoFullPath2)) {
                File.Copy(CopyMotoFullPath2, CopySakiFullPath, true);
            }
            else {
                Console.WriteLine("コピー元ファイル{0}が存在しません。", CopyMotoFullPath2);
                return;
            }
        }
        Console.WriteLine("正常終了しました。");
    }
}


F02 WinScpのcdとlcdとputのコマンドリスト作成

エクスプローラから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class Program
{
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    [STAThreadAttribute]
    static void Main()
    {
        var FullPathList = new List<string>();
        if (Clipboard.ContainsFileDropList()) {
            // データを取得する(取得できなかった時はnull)
            System.Collections.Specialized.StringCollection files = Clipboard.GetFileDropList();

            // 取得したファイル名を列挙する
            foreach (string EachFullPath in files) {
                FullPathList.Add(EachFullPath);
            }
        }
        else {
            string ClipboardText = GetClipboard();
            if (ClipboardText != "") {
                FullPathList.Add(ClipboardText);
            }
        }

        // フルパスの昇順にソートしておく
        FullPathList.Sort();

        var WriteStrList = new List<string>();
        var FolderSet = new HashSet<string>();
        foreach (string EachFullPath in FullPathList) {
            string CurrFolderPath = System.IO.Path.GetDirectoryName(EachFullPath);
            if (CurrFolderPath.EndsWith(@"\") == false) {
                CurrFolderPath += @"\";
            }

            string CurrFileName = System.IO.Path.GetFileName(EachFullPath);

            // 初登場のフォルダの時の処理
            if (FolderSet.Add(CurrFolderPath)) {
                if (WriteStrList.Count > 0) {
                    WriteStrList.Add("");
                }
                else {
                    WriteStrList.Add(new string('#', 70));
                }

                // 3番目の\までを削除
                string LinuxDirectoryPath = Regex.Replace(CurrFolderPath, @"^((.*?)\\){3}", @"\");
                LinuxDirectoryPath = LinuxDirectoryPath.Replace('\\', '/');
                WriteStrList.Add(" cd " + LinuxDirectoryPath);

                WriteStrList.Add("lcd " + CurrFolderPath);
            }
            WriteStrList.Add("put " + CurrFileName);
        }

        if (WriteStrList.Count == 0) {
            MessageBox.Show("出力するWinScpコマンドがありません。");
            return;
        }

        // テキストファイルに保存
        string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") + ".txt";
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        // テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);

        // クリップボートにも出力
        WriteStrList.Add("");
        string WillOut = string.Join(Environment.NewLine, WriteStrList.ToArray());
        Clipboard.SetText(WillOut);
    }

    //クリップボートのURLを返す
    static string GetClipboard()
    {
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
            return iData.GetData(DataFormats.Text).ToString();
        return "";
    }

    // Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


F03 WinScpのlcdとputのコマンドリストからフルパスリスト作成

コマンドプロンプトから使用
System.Windows.Formsを参照設定する必要あり

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;

class Program
{
    const string PathEditor = @"C:\Program Files\sakura\sakura.exe"; //Sakura

    [STAThreadAttribute]
    static void Main(string[] args)
    {
        string BaseFileFullPath = "";
        if (args.Length > 0) {
            BaseFileFullPath = args[0];
        }
        else {
            MessageBox.Show("コマンドライン引数がありません");
            return;
        }

        string[] LineDataArr = System.IO.File.ReadAllLines(BaseFileFullPath);
        var WriteStrList = new LinkedList<string>();

        string CurrFolder = "";
        foreach (string EachLineData in LineDataArr) {
            // 先頭の#は削除して扱う
            string wkLineData = EachLineData;
            if (EachLineData.StartsWith("#")) {
                wkLineData = EachLineData.Substring(1);
            }

            if (Regex.IsMatch(wkLineData, @"^ *lcd +")) {
                CurrFolder = Regex.Replace(wkLineData, @"^ *lcd +", "");
                if (WriteStrList.Count > 0) {
                    WriteStrList.AddLast("");
                }
                continue;
            }

            if (Regex.IsMatch(wkLineData, @"^ *put +")) {
                string CurrFile = Regex.Replace(wkLineData, @"^ *put +", "");
                string CurrFullPath = System.IO.Path.Combine(CurrFolder, CurrFile);
                WriteStrList.AddLast(CurrFullPath);
            }
        }

        if (WriteStrList.Count == 0) {
            MessageBox.Show("出力するフルパスリストがありません。");
            return;
        }

        // 先頭に日時を出力
        string NowStr = DateTime.Now.ToString("yyyy年MM月dd日(ddd)HH時mm分");
        WriteStrList.AddFirst(string.Format("作成日時 {0}" + Environment.NewLine, NowStr));

        // テキストファイルに保存
        string FileName = string.Format("{0}.txt", NowStr);
        string SaveFullPath = System.IO.Path.Combine(getWorkFolder(), FileName);
        System.IO.File.WriteAllLines(SaveFullPath, WriteStrList.ToArray());

        // テキストファイルを開く
        var InsProcessStartInfo = new System.Diagnostics.ProcessStartInfo();
        InsProcessStartInfo.FileName = PathEditor;
        InsProcessStartInfo.Arguments = SaveFullPath;
        InsProcessStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
        System.Diagnostics.Process.Start(InsProcessStartInfo);

        // クリップボートにも出力
        WriteStrList.AddLast("");
        string WillOut = string.Join(Environment.NewLine, WriteStrList.ToArray());
        Clipboard.SetText(WillOut);
    }

    // Dドライブが無かったらCドライブを使う
    static private string getWorkFolder()
    {
        return System.IO.Directory.Exists(@"D:\WorkFile\") ? @"D:\WorkFile\" : @"C:\WorkFile\";
    }
}


Z01 URLからユーザとパスワードを返すクラス

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

/* このクラスの使用例
    static void Main()
    {
        //テストケース1 資格情報付きURLの場合
        var TestIns1 = new _Z01_DeriveUserPassFromDomain("https://oraclesqlpuzzle.ninja-web.net/");
        Console.WriteLine(TestIns1.GetUser());
        Console.WriteLine(TestIns1.GetPass());

        //テストケース2 資格情報無しURLの場合
        var TestIns2 = new _Z01_DeriveUserPassFromDomain("https://aaaa:bbbb@oraclesqlpuzzle.ninja-web.net/");
        Console.WriteLine(TestIns2.GetUser());
        Console.WriteLine(TestIns2.GetPass());
    }
*/

class _Z01_DeriveUserPassFromDomain
{
    const string DefaultUser = "デフォルトのユーザ";
    const string DefaultPass = "デフォルトのパスワード";
    const string UserPassListFullPath = @"設定ファイルのフルパス";

    private string mUser = "";
    public string GetUser()
    {
        return mUser;
    }

    private string mPass = "";
    public string GetPass()
    {
        return mPass;
    }

    // コンストラクタ
    public _Z01_DeriveUserPassFromDomain(string pURL)
    {
        // ドメインの前を削除
        pURL = Regex.Replace(pURL, "^(https?:)?//", "");

        // 最初の/以降を削除
        pURL = Regex.Replace(pURL, "/.*$", "");

        // www無しで統一する
        pURL = pURL.Replace("www.", "");

        // 資格情報が既にあったら使う
        const string Pattern = @"^(.*?):(.*?)@";
        if (Regex.IsMatch(pURL, Pattern)) {
            Match InsMatch = Regex.Match(pURL, Pattern);
            mUser = InsMatch.Groups[1].Value;
            mPass = InsMatch.Groups[2].Value;
        }
        else {
            DeriveUserPass(pURL);
        }
    }

    private void DeriveUserPass(string pTargetDomain)
    {
        InitUserPassInfoList();

        foreach (UserPassInfoDef EachUserPassInfo in mUserPassInfoList) {
            string CurrDomain = EachUserPassInfo.Domain;

            // ドメインの前を削除
            CurrDomain = Regex.Replace(CurrDomain, "^(https?:)?//", "");

            // 最初の/以降を削除
            CurrDomain = Regex.Replace(CurrDomain, "/.*$", "");

            //www無しで統一する
            CurrDomain = CurrDomain.Replace("www.", "");

            if (pTargetDomain == CurrDomain) {
                mUser = EachUserPassInfo.User;
                mPass = EachUserPassInfo.Pass;
                return;
            }
        }
        mUser = DefaultUser;
        mPass = DefaultPass;
    }

    struct UserPassInfoDef
    {
        internal string Domain;
        internal string User;
        internal string Pass;
    }
    List<UserPassInfoDef> mUserPassInfoList = new List<UserPassInfoDef>();

    // IDとパスワード情報の設定
    private void InitIDPassInfoList()
    {
        string[] LineDataArr = File.ReadAllLines(UserPassListFullPath);
        foreach (string EachLineData in LineDataArr) {
            string[] EachData = Regex.Split(EachLineData, " +");
            if (EachData.Length < 3) continue;
            AddIDPassInfo(EachData[0], EachData[1], EachData[2]);
        }
    }

    private void AddUserPassInfo(string pDomain, string pUser, string pPass)
    {
        UserPassInfoDef WillAdd;
        WillAdd.Domain = pDomain;
        WillAdd.User = pUser;
        WillAdd.Pass = pPass;
        mUserPassInfoList.Add(WillAdd);
    }
}