2016-03-01 3 views
0

У меня есть сценарий, в котором каждый день я получаю 2 файла csv, где имена файлов похожи на CMCS_ {Timestamp}, например CMCS_02012016100101 и CMCS_02012016100102. Эти 2 файла - это разные файлы и имеют разную структуру, но поскольку эти 2 файла будут входить в ту же папку, где мои инструменты ETL подберут ее и обработать. Поэтому я написал сценарий, в котором сценарий будет основываться на структуре файла, чтобы отличить его от файла A или файла B.Powershell копирует файлы в другое место на основе содержимого файла

Для файла A я скажу сценарию, чтобы посмотреть первую строку файла, и если line start with 'Name, Emp (Date). ', затем скопируйте файл в папку «А», если строка начинается с «Name, Group». 'затем скопируйте файл в папкуB else скопируйте файл в папку 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

Ваш вопрос может быть вызван Select -Index 1 как Powershell использует индексацию на основе 0 это будет на самом деле выбрать вторую строку файла. Если вы измените это на 0, он должен правильно получить строку заголовка.

Отдельное примечание, вместо того, чтобы делать $filePath = $fileDirectory + "\" + $file;, вы можете просто использовать $file.FullName, чтобы получить путь к файлу.

EDIT:

[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 
    } 
} 
+0

Кроме того, оператор «, а затем скопируйте файл folderA и если линия начать с:

Я думаю, что это должен делать то, что вы после" Имени группы. затем скопируйте файл в папку B. Скопируйте файл в папку C ", похоже, не верен. Файлы будут скопированы только в «D: \ Output \ FileA» и «D: \ Output \ FileC». –

+0

изменен на else, если вместо – user664481

+0

Я уже исправил индекс до 0, но он все еще не работает. – user664481

Смежные вопросы