Windows:使用通配符目录复制文件

Windows:使用通配符目录复制文件

我们有一个第三方应用程序,它按日期(然后按实例)将数据存储到目录中,我们想将 *.csv 文件从该目录复制到服务器。我们只想要实例目录中的数据 — — 不想要更高或更低的数据。

示例结构(ItemX 是实例并且可以有子目录):

C:\APP
------ Machine1
------ -------- Data
------ -------- ---- 081209
------ -------- ---- ------ Item1 -> report.csv
------ -------- ---- ------ Item2 -> report.csv
------ -------- ---- 081109
------ -------- ---- ------ Item1 -> report.csv
------ -------- ---- ------ Item2 -> report.csv
------ Machine2
------ -------- Data
------ -------- ---- 081209
------ -------- ---- ------ Item1 -> report.csv
------ -------- ---- ------ Item2 -> report.csv
------ -------- ---- 081109
------ -------- ---- ------ Item1 -> report.csv
------ -------- ---- ------ Item2 -> report.csv

是否有一种通用的方法来编写这个,以便我们可以只创建一个脚本而不是每台机器创建一个脚本?

答案1

如果 machineX 是机器的名称,则可以使用环境变量 %COMPUTERNAME%

类似于

xcopy c:\app\%computername%\Data\*\Item?\*.csv target\* /s

答案2

以下是一种可行的方法。它不完全是命令行,但可以从命令行调用:

using System;
using System.IO;

namespace MachineInstanceCopyThing
{
    static class Program
    {
        [STAThread]
        static void Main ()
        {
            string AppDir = @"C:\App";
            string TargetDir = @"W:\Dest";

            if (!Directory.Exists (AppDir))
            {
                // do something to report the error
                return;
            }

            if (!Directory.Exists (TargetDir))
            {
                // do something to report the error
                return;
            }

            DirectoryInfo AppDirInfo = new DirectoryInfo (AppDir);

            // iterate through machine folders
            foreach (DirectoryInfo MachineDirectory in AppDirInfo.GetDirectories ())
            {
                string DataPath = MachineDirectory.FullName + @"\data";

                if (!Directory.Exists (DataPath))
                {
                    // do something to report the error
                    continue;
                }

                DirectoryInfo DataDir = new DirectoryInfo (DataPath);

                // iterate through date directories
                foreach (DirectoryInfo DateDirectory in DataDir.GetDirectories ())
                {
                    // iterate through instance directories
                    foreach (DirectoryInfo InstanceDirectory in DateDirectory.GetDirectories ())
                    {
                        string TargetPath = TargetDir + @"\" + InstanceDirectory.Name;

                        // create instance directory at the target
                        Directory.CreateDirectory (TargetPath);

                        foreach (FileInfo CSVFile in InstanceDirectory.GetFiles ("*.csv"))
                        {
                            File.Copy (CSVFile.FullName, TargetPath + @"\" + CSVFile.Name);
                        }
                    }
                }
            }
        }
    }
}

除了确保源和目标存在之外,它不会做太多的错误检查。

相关内容