2016-04-07 1 views
1

Я пытаюсь собрать сценарий PowerShell для запуска файлов журнала txt и удаления доменных имен/URL-адресов.Попытка заменить строки в файле, но его слишком много заменить

До сих пор я просто заменяю замену на файлы, но когда я пытаюсь это сделать, он не работает так, как я ожидаю, например.

, если у меня есть текстовый файл, содержащий:

intranet.contoso.com и текст

после запуска моего сценария, чтобы заменить intranet.contoso.com с DOMAIN1 из положить, я бы получаете

DOMAIN1 DOMAIN1aDOMAIN1nDOMAIN1dDOMAIN1 DOMAIN1sDOMAIN1oDOMAIN1mDOMAIN1eDOMAIN1 DOMAIN1tDOMAIN1eDOMAIN1xDOMAIN1tDOMAIN1

Так что я не уверен, где я ошибаюсь. Мой код до сих пор

$domains = ,("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2") 
$path = Read-Host "Please enter the full path to the directory containing the files to be sanatized" 

    $files = Get-ChildItem –Path $path *.txt 
    foreach ($file in $files) 
    { 
     for($x=0; $x -lt $domains.Count; $x++) 
     { 
      (Get-Content $file.PSPath) | 
      Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } | 
      Set-Content $file.PSPath 

      (Get-Content $file.PSPath) | 
      Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } | 
      Set-Content $file.PSPath 

     } 
    } 

ответ

3

Я уверен, что ваш главный вопрос является использование unary operator, когда вы определяете $domains. Если вы посмотрите на свой первый элемент.

PS D:\temp> $domains[0] 
mydomain.net 
mydomain 

Что бы вы ожидали, но это следующий шаг, на котором возникла проблема. Попробуем получить строку «mydomain»

PS D:\temp> $domains[0][1] 

Ничего? Это странно. Нет, нет, если вы знаете, что произошло. Давайте посмотрим на другой элемент этого зубчатого массива.

PS D:\temp> $domains[0][0] 
mydomain.net 
mydomain 

Что это за ерунда? Первым элементом первого элемента вашего массива является другой массив. Сейчас смотрите это:

PS D:\temp> $domains[0][0][1] 
mydomain 

Элемент, который мы пытались получить пару шагов назад. Вы создали массив, в котором первым элементом был массив, содержащий массив из двух элементов.

Причина, по которой ваш тестовый файл выглядит так, как он сделал, заключается в том, что первый пример попытался бы использовать $domains[0][1], который был бы нулевым и соответствовал бы каждому пространству между символами, следовательно, ваш вывод.

Просто удалите унарный оператор.

$domains = ("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2") 

Также стоит отметить, что -replace является оператором регулярное выражение, так что вы должны быть осторожны при использовании мета-символы в ваших согласующих строк. Период, например. Статический вызов метода regex может решить эту проблему, чтобы убедиться, что ваши строки сопоставляются буквально.

$_ -replace [regex]::Escape($domains[$x][1]), "DOMAIN$($x+1)" 

Вы также можете улучшить вам замену логики, зная, что -replace также является оператором массива. Поэтому внутри вашей петли вы можете заменить это

(Get-Content $file.PSPath) | 
Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } | 
Set-Content $file.PSPath 

(Get-Content $file.PSPath) | 
Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } | 
Set-Content $file.PSPath 

С этим.

(Get-Content $file) -replace $domains[$x][0], "DOMAIN$($x+1)" -replace $domains[$x][1], "DOMAIN$($x+1)" | 
Set-Content $file 

.pspath в то время как действительный не требуется. Командлеты Get/Set-Content будут соответствовать пути по имени параметра из объекта $file. Я не могу больше помочь. Это непроверено, так как у меня нет хороших текстовых файлов примеров. Испытайте и испытайте еще немного, чтобы быть уверенным.

+0

Я довольно новичок в powershell, так что это помогло мне больше, чем одному! ура !! – user1865044

0

Как другие два ответа указывают, массив-из-массивов путаться с ,(x,y,),(foo,bar)" syntax. Use of @ `или просто сбросив лидирующим запятая фиксирует это.

Я также обнаружил, что запись в тот же файл, который вы читаете, не работает хорошо для меня, даже с синтаксисом (Get-Content $file.PSPath). Я получаю более последовательные результаты, записывая новый файл, а затем переименовывая его позже.

+0

Это не проблема. Это должно просто отправить массив строк вниз по конвейеру. Проблема заключается в '$ domains', регулярное выражение соответствует' $ nulls', поэтому замена его происходит в каждом пространстве. Первые '$ domains [0] [1]' равны $ null. – Matt

+0

Это научит меня думать на C#. 'Get-Content' разлагается по строкам, а не по типу. Правильно, я разобью старый биологический процессор и скоро вернусь. –

+0

Полностью переписал ответ. Однако ответ Мэтта на деньги. –

1

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

попытка перезаписи первой линии этого (массив массивов):

$domains = @(@("mydomain.net","mydomain"),@("yourdomain.net","yourdomain"),@("mydomain2.net","mydomain2"))