Powershell根据文件内容将文件复制到不同的位置

时间:2016-03-01 11:03:05

标签: powershell

我的情况是每天我会收到2个csv文件,其中文件命名类似于CMCS_ {Timestamp},例如CMCS_02012016100101和CMCS_02012016100102。这2个文件是不同的文件,并且具有不同的结构,但是因为这2个文件将进入我的ETL工具将拾取并处理的同一文件夹。所以我编写了一个脚本,脚本将根据文件的结构来区分它是文件A还是文件B.

对于文件A,我告诉脚本查看文件的第一行,如果行以'Name,Emp(Date)。'开头,则将文件复制到folderA,如果行以'Name'开头,组。'然后将文件复制到folderB,将文件复制到文件夹C

这里是我写的代码,powershell不会产生任何错误,但它也不会产生任何结果。我想知道我的剧本中有什么问题。

$fileDirectory = "D:\Data";
$output_path  = "D:\Output\FileA";
$output_path2 = "D:\Output\FileB";
$output_path2 = "D:\Output\FileC";

foreach($file in Get-ChildItem $fileDirectory)
{
# the full file path.
$filePath = $fileDirectory + "\" + $file;
$getdata = Get-Content -path $filePath
$searchresults = $getdata | Select -Index 1 | Where-Object { $_ -like 'Name,Emp(Date).*' }
$searchresults2 = $getdata | Select -Index 1 | Where-Object { $_ -like 'Name,Group.*' }

if ($searchresults -ne $null) {
Copy-Item $filePath $output_path
} 
if ($searchresults2 -ne $null) {
Copy-Item $filePath $output_path2
}
}

1 个答案:

答案 0 :(得分:1)

您的问题可能是由Select -Index 1引起的,因为Powershell使用基于0的索引,这实际上会选择文件的第二行。如果将其更改为0,则应正确获取标题行。

另请注意,您可以使用$filePath = $fileDirectory + "\" + $file;来获取文件路径,而不是$file.FullName

编辑:

我认为这应该做你想要的事情:

[string] $FileDirectory = "D:\Data";
[string] $OutputPath  = "D:\Output\FileA";
[string] $OutputPath2 = "D:\Output\FileB";
[string] $OutputPath3 = "D:\Output\FileC";

foreach ($FilePath in Get-ChildItem $FileDirectory | Select-Object -ExpandProperty FullName)
{
    [string] $Header = Get-Content $FilePath -First 1

    if ($Header -match 'Name,Emp.*') {
        Copy-Item $FilePath $OutputPath
    }
    elseif ($Header -match 'Name,Group.*') {
        Copy-Item $FilePath $OutputPath2
    }
    else {
        Copy-Item $FilePath $OutputPath3
    }
}