我们有一个第三方应用程序,它按日期(然后按实例)将数据存储到目录中,我们想将 *.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);
}
}
}
}
}
}
}
除了确保源和目标存在之外,它不会做太多的错误检查。