2014-11-17 2 views
0

Я пытаюсь написать скрипт, который ищет все файлы в каталоге, содержащем слово «Datamonitor», и переименуйте файлы с использованием существующего имени с префиксом «Datamonitor».Powershell, найдите файлы, содержащие ключевое слово, затем переименуйте эти файлы.

Я попытался использовать командлет SelectString, но это, похоже, не доступно для меня. Я нашел код, который можно было бы изменить, но я не мог понять, как это сделать.

$directoryToTarget=$args[0] 
$wordToFind=$args[1] 
$wordToReplace=$args[2] 

Clear-Content log.txt 

Get-ChildItem -Path $directoryToTarget -Filter *.properties -Recurse | where { !$_.PSIsContainer } | % { 

$file = Get-Content $_.FullName 
$containsWord = $file | %{$_ -match $wordToFind} 
If($containsWord -contains $true) 
{ 
    Add-Content log.txt $_.FullName 
    ($file) | ForEach-Object { $_ -replace $wordToFind , $wordToReplace } | 
    Set-Content $_.FullName 
} 
} 

ли кто-нибудь сможет помочь мне изменить это, чтобы найти мое ключевое слово и включают в себя Rename-Item -Newmane {"Datamonitor_""+$_.Name}

Большое спасибо

ответ

0

Ниже будет искать все * .properties файлы и если они содержат ключевое слово «DataMonitor» файл будет переименован.

Get-ChildItem -Path $directoryToTarget -Filter *.properties -Recurse | where { !$_.PSIsContainer } | % { 

    $i = Get-Content $_ |Select-String "Datamonitor" -SimpleMatch 

    if ($i -ne $null) 
    { 
     Rename-Item $_ -NewName ('Datamonitor_'+$_.name) 
    } 
} 

Один недостаток, однако, заключается в том, что это может работать только один раз. Запуск его несколько раз добавит к имени файла дополнительный «Datamonitor_». Это можно легко устранить.

PS. В вашем вопросе вы запрашиваете все файлы, затем в get-childitem вы указываете фильтр. Я использовал фильтр для нужд этого примера, если хотят все файлы, просто удалите -filter * .properties

+0

Спасибо вам за помощь. – sticks

+0

Извините, еще один вопрос ... предположим, я хотел создать текстовый файл, содержащий имена файлов всех файлов, содержащих «datamonitor», как бы я это сделал? Могу ли я поменять «Переименовать-элемент» на что-то вроде «ForEach-Object {$ _. Name}> C/path/file.txt' – sticks

+0

Я бы использовал ForEach-Object {$ _. Name | out-file C: \ path \ file.txt -append} –

0
$file | %{$_ -match $wordToFind} 

чеку для матчей $wordToFind во имени файл , а не файл содержания. Для последнего вам нужно что-то вроде

$file | ? { (Get-Content $_) -pattern $wordToFind } 

или (лучше)

$file | ? { Select-String -LiteralPath $_ -Pattern $wordToFind } 

Заметьте, что оба способа сделать регулярное выражение соответствует, так что если $wordToFind содержит специальные символы, которые нужно правильно их избежать:

[regex]::Escape($wordToFind) 
+0

Спасибо за помощь. – sticks