Имя папки дедушки до имени файла - PullRequest
0 голосов
/ 18 января 2019

У меня есть скрипт, который запускается, когда я указываю точный каталог c: \ script \ 19 \, проблема в том, есть другие папки в скрипте c: \, такие как 18, 17, 16. У меня есть скрипт, который добавляется 19 перед всеми файлами. Как мне получить это, чтобы посмотреть на дедушку файла, который он переименовывает, и добавить его? Пример того, как это работает, это файлы вроде этого:

c:\script\18\00000001\Plans.txt
c:\script\19\00001234\Plans.txt
c:\script\17\00005678\App.txt

Но мой скрипт переименовывает файлы, подобные этим

c:\script\18\00000001\19-0001 Plans.txt
c:\script\19\00001234\19-1234 Plans.txt
c:\script\17\00005678\19-5678 App.txt

Мой скрипт такой:

 $filepath = Get-ChildItem "C:script\" -Recurse |
  ForEach-Object {
$parent = $_.Parent  
$grandparent =  $_.fullname | Split-Path -Parent | Split-Path -Parent | Split-Path -Leaf
    }
Get-ChildItem "C:\Script\" –recurse –file | 
Where-Object {$_.Name –notmatch ‘[0-9][0-9]-[0-9]’} | 
rename-item -NewName {$grandparent + '-' + $_.Directory.Name.SubString($_.Directory.Name.length -4, 4) + ' ' + $_.Name}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Самое простое решение - объединить разделение строк с оператором -split с блоком сценария с задержкой привязки (который вы пытались использовать):

Get-ChildItem C:\Script –Recurse –File -Exclude [0-9][0-9]-[0-9]* |
  Rename-Item -NewName { 
    # Split the full path into its components.
    $names = $_.FullName -split '\\'
    # Compose the new file name from the relevant components and output it.
    '{0}-{1} {2}' -f $names[-3], $names[-2].Substring($names[-2].Length-4), $_.Name 
  } -WhatIf

-WhatIf предварительный просмотр операция переименования; удалите его для фактического переименования.
Обратите внимание, как -Exclude используется с выражением подстановочного знака непосредственно с Get-ChildItem для исключения файлов, которые уже имеют целевой формат имени.

Основная причина, по которой ваш оригинал не работал, состоит в том, что вы вычислили одиночный, статический $parent и $grandparent значений, вместо получения значений входного пути для каждого входного пути.

Кроме того, ваш $grandparent расчет был излишне сложным; Полезный ответ Герта Яна Краайевельда показывает более простой способ.

0 голосов
/ 18 января 2019

Чтобы получить прародителя объекта $ file:

$file.Directory.Parent

Родительский каталог файла является членом «Directory» объекта файла.

Родительский каталог каталога является «родительским» элементом объекта каталога.

Это не сложно, но запутать это точно ...


Редактировать

Вы спрашивали о моем решении:

Get-ChildItem C:\script -Recurse -File | ForEach-Object {
  $parent = $_.Directory.Name
  $grandparent = $_.Directory.Parent.Name
  Rename-Item $_.FullName -NewName "$grandparent-$($parent.Substring($parent.length-4,4)) $($_.name)" 
}

Я использовал параметр -file в Get-ChildItem, чтобы получать только файлы из структуры папок. Я не уверен, что подходит в вашей ситуации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...