Как перебирать файлы в Powershell? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь переместить файлы из одной папки в другую, и ниже приведен код PowerShell, который я придумал:

$folder = 'C:\test'
$filter = '*.*'                             # <-- set this according to your requirements
$destination = 'C:\Folder1'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $true              # <-- set this according to your requirements
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated
 Write-Host "The file '$name' was $changeType at $timeStamp"
 #$UNI_PRINT = Select-String -Path C:\Test\*.Print_Job -Pattern "SATO"\\
 $file = Get-Content -Path $folder
 $containsWord = $file | %{$_ -match "SATO"}

if ($containsWord -contains $true)
{
    Write-Host Contains String
    Move-Item $path -Destination $destination -Force -Verbose # Force will overwrite files with same name
}
else
{
    Write-Host Not Contains String
}
}

Папка C: \ test постоянно получает от 5 до 6 файлов с расширением .Print_Job.

Итак, я написал событие Filecreated, чтобы я мог постоянно отслеживать папку, чтобы проверить, был ли файл создан или нет.

Внутри этого я хочу прочитать содержимое каждого полученного файла, прежде чем перемещать его на основе следующих критериев.

  • Если содержимое файла содержит Motorola, этот файл должен быть перемещен в папку1
  • Если содержимое файла содержит SATO, этот файл должен быть перемещен в папку 2.
  • Если в Файловом содержимом содержится Zebra, этот файл должен быть перемещен в Папку 3.

Как я могу сделать это в Poweshell.

Ждем ваших решений.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Редактировать Относится теперь к требованиям.

  • RegEx с условием или используется в Select-String и Найденные файлы и соответствующие значения хранятся в хэш-таблице.
  • Наконец, итерируется хеш-таблица, целевые папки оцениваются с помощью Get-Variable, создаются, если они отсутствуют, и файл перемещается (с необязательным -whatif)

## Q:\Test\2018\04\27\SO_50067617.ps1
$directory_source   = '.\*'
$directory_target_motorola = 'c:\test\folder1'
$directory_target_sato =     'c:\test\folder2'
$directory_target_zebra =    'c:\test\folder3'

$FilePattern = @{}
Get-ChildItem $directory_source -File | Select-String "(MOTOROLA|SATO|ZEBRA)" |
  ForEach-Object {
      $FilePattern[$_.FileName] = $_.Matches.Value
  }

$FilePattern.GetEnumerator() | ForEach-Object {
  $Target = (Get-Variable "directory_target_$($_.Value)").Value
  If (!(Test-Path $Target)) { md $Target }
  mv $_.Name $Target -whatif
}
0 голосов
/ 27 апреля 2018

Как-то так должно работать ....

$directory_source = '<path>'
$directory_target_motorola = '<path>'
$directory_target_sato = '<path>'
$directory_target_zebra = '<path>'

$files = $(ls $directory)
foreach ($file in $files) {
  if ( $(gc $file | Select-String "motorola" -Quiet) ) {
    mv -Path $file.Fullname -Destination $directory_target_motorola
  } elseif ( $(gc $file | Select-String "sato" -Quiet) ) {
    mv -Path $file.Fullname -Destination $directory_target_sato 
  } elseif ( $(gc $file | Select-String "zebra" -Quiet) ) {
    mv -Path $file.Fullname -Destination $directory_target_zebra 
  }
}

Обратите внимание, я не пытался запустить это.

Удачи.

...