Строка поиска PowerShell и копирование файла - PullRequest
0 голосов
/ 17 мая 2018

Я готовлю скрипт для поиска текста внутри файлов («test» и «test1» - ключевые слова в этом сценарии), и как только все файлы найдены, их следует скопировать в другое место, сохраняя структура папок.

Например: Путь c: \ src содержит 10 файлов, 3 включают в себя слова поиска. Эти 3 файла должны быть скопированы в c: \ dst \

Все должно быть рекурсивно для всех подкаталогов c: \ src.

Так что, если в пути c: \ src \ somefolder \ были другие файлы с такими же поисковыми словами, они должны быть скопированы в c: \ dst \ somefolder \

Вот мой код:

Write-Host ""
Write-Host "Note: Path must end with '\'"
Write-Host ""

# Var.
$sourceDir = Read-Host 'Source path'
$targetDir = Read-Host 'Destination path'

# Decl.
$tree = gci -Directory -Name -Recurse $sourceDir

# Check if $sourceDir exist
if(!(Test-Path -Path $sourceDir )){
  "Source is not a valid path!" ; pause
exit 1
}

# Check (and create) $targetDir
if(!(Test-Path -Path $targetDir )){
  mkdir $targetDir -Force
}

# Rebuild Tree
foreach ( $folders in $tree ) { mkdir $targetDir\$folders -Force }

# Copy Founded Files
$ftc = Get-ChildItem $sourceDir -Recurse | Select-String "test","test2" | Select Path |
foreach{    
  $targetFile = $targetDir + $_.FullName.SubString($sourceDir.Length); 
  Copy-Item $_ -destination $targetFile
}

Не могу понять, где ошибка. Кто-нибудь знает, как я могу это решить?

Предложенная ошибка: Copy-Item: Невозможно найти устройство. Единица с именем '@ {Path = C' не существует.

1 Ответ

0 голосов
/ 17 мая 2018

В вашем скрипте были серьезные ошибки

  • параметр -Name в вашем gci, строящем дерево, оставило только имя subdir, поэтому часть дерева перестроения имела только плоскую структуру, которую gci может использовать для файлов, которые позже могут't match.
  • ваш шаблон строки выбора совпадает дважды, поскольку 2-й содержит 1-й, поэтому я добавил параметр -Unique, чтобы выбрать Path
  • used Get-Item $ _. Путь для сборкиПередача имени целевого файла в Copy-Item

Это сработало здесь (в другом) дереве тестов:

## Q:\Test\2018\05\17\SO_50391092.ps1
Write-Host ""
Write-Host "Note: Path must end with '\'"
Write-Host ""

# Var.
#$sourceDir = Read-Host 'Source path'
#$targetDir = Read-Host 'Destination path'
$sourceDir = "C:\test"
$targetDir = "A:\Test"

# Decl.
$tree = gci -Directory -Recurse $sourceDir

# Check if $sourceDir exist
if(!(Test-Path -Path $sourceDir )){
  "Source is not a valid path!" ; pause
  exit 1
}

# Check (and create) $targetDir
if(!(Test-Path -Path $targetDir )){mkdir $targetDir -Force}

# Rebuild Tree
foreach ( $folder in $tree ) {
    mkdir ($folder.fullname.replace($sourceDir,$targetDir)) -Force |Out-Null
}

# Copy Found Files
$ftc = Get-ChildItem $sourceDir -Recurse | Select-String "test","test2" | Select -Unique Path |
foreach{
  $sourceFile = Get-Item $_.Path
  $targetFile = $sourceFile.Fullname.Replace($sourceDir,$targetDir)
  $sourceFile | Copy-Item -Destination $targetFile
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...