2017-01-03 4 views
1

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

CAL aB12 AUG.docx 
CAL cDe345 AUG.docx 
CAL FGHiJKL6789 AUG.docx

Мне нужно заменить «CAL» с «календарь» и «AUG» с «август» в именах файлов.

Лучшее, что мне удалось сделать, - запустить два командлета (по одному для каждой замены), скованные вместе с точкой с запятой. Это работает, но я знаю, что это грубо.

gci | Rename-Item -NewName { $_ -replace "CAL", "Calendar" }; 
gci | Rename-Item -NewName { $_ -replace "AUG", "August" } 

После подробного поиска, я нашел StackOverflow 3403217. Из-за недостатка знаний и опыта я не смог (и я старался) перевести любой из пяти ответов, которые он предоставляет, в один командлет, который работает для того, что я пытаюсь сделать.

p.s. Я вставляю копии интересующих файлов в C: \ Temp и работаю оттуда. Я использую Windows 7.

ответ

-1
Get-Content List.txt | 

    Where-Object \\{ $_ -match '^\\\\' \\} | 

    ForEach-Object \\{ $_ -replace 

    '^\\\\(\S+).+','$1' \\} 

Вы в основном должны захватить текстовый файл и найти совпадения для любой строки вы хотите, и запустить через цикл, чтобы заменить его. Почему это в Powershell? Я не знаю.

+1

Зачем это делать в Powershell? Я изначально попытался сделать это на сеансе командной строки (cmd), а IT обработал FILENAMES, как показано ниже. Что мне делать по-другому в сеансе командной строки? C: \ TEMP> реж CAL ab123 AUG.doc CAL cde45 AUG.doc CAL fghijk6889 AUG.doc C: \ TEMP> жэнь "CAL * Aug.doc" "календарь * August.doc" C: \ TEMP> dir calendar3 August.doc calendar5 August.doc calendarjk6889 August.doc – pwt12855

+0

Спасибо. Я пошел с Powershell, потому что то, что я хочу сделать, не может быть сделано в сеансе командной строки. Использование: (ren «CAL * Aug.docx» «calendar * August.docx» подбирает имена файлов. Многие люди предложили мне сеанс командной строки, но когда они дают ему шанс, они меняют свое мнение. – pwt12855

+0

Были звездочки подстановочных знаков в моих ответах, прежде чем я их представил. – pwt12855

1

попробовать что-то вроде этого

$hashreplace = @{} 
$hashreplace.'old1' = 'new1' 
$hashreplace.'old2' = 'new2' 

Get-ChildItem -Recurse -File -Path "c:\temp\" | % { 
    $filename = $_.FullName 
    $text = $_.Name 
    $hashreplace.Keys | %{if ($text -ne $null) {$text = $text.Replace($_, $hashreplace[$_]) } } 
    Rename-Item -Path $filename -NewName $text 
} 
+0

Спасибо, Esperento57. Я ценю вашу помощь. Хотя я уверен, что ваше решение на деньги, это далеко за пределами моего нынешнего понимания. Ниже показано решение, с помощью которого я могу обнять руки. Get-Childitem | Rename-Item -NewName {($ _. Name -replace "cal", "calendar") -replace "aug", "August"} – pwt12855

1

Все, что вам нужно сделать, это гирляндная операция замены:

gci | Rename-Item -NewName { $_.Name -replace "CAL","Calendar" -replace "AUG","August" } 

Как @ Esperento57 упоминается в комментариях оператор -replace делает регулярные замены выражения. В вашем случае это не делает разницы, но если ваши строки поиска содержат специальные символы, они могут потребовать вытекающие, например:

gci | Rename-Item -NewName { $_.Name -replace [regex]::Escape("CAL"),"Calendar" -replace [regex]::Escape("AUG"),"August" } 

Или вы могли бы сделать простые строковые замены путем последовательного подключения цепочки Replace() вызовов методов:

gci | Rename-Item -NewName { $_.Name.Replace("CAL","Calendar").Replace("AUG","August") } 
+0

с этим решением, будьте осторожны - замените замену регулярным выражением (для вашего примера это за работой) – Esperento57

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