2015-12-24 3 views
0

Очень новая для Powershell (и программирования в целом), поэтому, пожалуйста, несите меня. Недавно я создал скрипт, который позволит пользователю изменять имена систем в файле резервной копии, а затем создавать новый .txt с новыми настройками. Проблема, с которой я столкнулся, заключается в том, что сценарий работает только для систем, которые следуют нашему соглашению об именах - новые системы или неправильно названные системы приводят к сбою сценария, поскольку он ищет имя, которое еще не существует. Это то, что я до сих пор:Powershell: Замена значений в .txt

$name = Read-Host 'What is the system name?' 
$currentdate = Get-Date -Format "MM_DD_YY_HH_MM_SS" 
if ($name -notlike "Sample*") 
    { 
     Read-Host 'Please begin naming conventions with "Sample".' 
     } 
     else { 
     (Get-Content C:\Test_Backup.txt)| 
Foreach-Object {$_-replace 'Sample[a-z , 0-9]*' , $name}| 
Out-file C:\Test_Success.txt} 

Так, например, при открытии файла резервной копии новой/неправильной системы и искать имя системы, это выглядит как NAME: «Wrongname123.» Скрипт не находит «Sample *» в файле, поэтому ничего не происходит. Я бы хотел изменить сценарий для работы с новыми/неправильно названными системами, заменив любое имя, которое появляется в цитатах, на правильное имя пользователя. Я даже не уверен, что это возможно, и я пока не смог найти ответ через поиск Google, который, я думаю, потому, что мне сложно объяснить, что я хочу делать. Я бы очень признателен за любую помощь, которую я могу получить.

EDIT:

Что я делаю это создание резервных копий системных настроек в .txt. При открытии файла резервной копии, это выглядит примерно так:

ИМЯ: "System1" ОБЪЕМ: "30" INPUT: "RGB" и т.д ...

Что я сделал это создать «главный» файл резервной копии, чтобы пользователи могли быстро загрузить файл в новую систему без необходимости вручную вводить все необходимые настройки. Единственная проблема заключается в том, что пользователь должен изменить имя при загрузке в новую систему (каждая система имеет уникальное имя). Мой пример файла резервной копии чрезвычайно упрощен - в файле много информации, поэтому нелегко войти и вручную изменить это. Когда я запускаю скрипт, он предлагает пользователю ввести имя для системы, которую они настраивают. Поэтому, если система в настоящее время называется «Sample6», и пользователь хочет изменить ее на «Sample7», проблем нет. Однако, если система называется «Wrongname1», сценарий не будет работать, потому что он ищет соглашение об именах «Sample». Так что я пытаюсь выяснить, как я могу заставить скрипт искать NAME: «[любое значение здесь]», а затем изменить любые значения, содержащиеся в цитатах. Надеюсь, это имеет смысл.

+0

i, как новичок, старайтесь держаться подальше от регулярных выражений, особенно в этой форме. от того, что я собираю, у вас могут возникнуть проблемы с потоком/привязкой. Во-вторых, похоже, что «Образец» - это желаемый шаблон, но затем вы его заменяете? :) Куда вы отправляете пример или два из двух хороших и плохих строк? –

+0

Привет Jaqueline, спасибо, что ответили. Я обновил свое оригинальное сообщение - я надеюсь, что теперь это будет немного больше! – Blake

+0

ну, а почему вы просто не читали системное имя, а если его «плохо» либо меняли, либо записывали? Кроме того, вы можете подумать о том, чтобы использовать другой текстовый формат файла - JSON или psd1 кажутся подходящими для такой задачи, а также xml, но это будет немного излишним, и работать с –

ответ

2

Если я понимаю ваш вопрос, вы ищете, чтобы заменить содержимое кавычек на пользовательский ввод. Если это так, то просто заменить регулярное выражение с помощью одного из this answer, например, так:

Foreach-Object {$_-replace '(["''])(?:(?=(\\?))\2.)*?\1' , $name}| 

Обратите внимание на двойной апостроф, поскольку PowerShell использует апострофы для постоянных строк. Если это то, что вы намереваетесь, убедитесь, что вы подтвердили ответ плаката, как только у вас достаточно репутации.

Если Test_Backup.txt содержит список атрибутов двоеточиями, например:

NAME: "WrongName123" 
LAST_BACKUP: "12_24_15_12_00_00" 
FAVORITE_COLOR: "Blue" 

тогда ваш скрипт заменит все значения в кавычки. Если вы хотите заменить только отмеченное имя, вам нужно вставить вызов Where-Object в конвейер. Я использую -like, но вы можете использовать -match, а также:

(Get-Content C:\Test_Backup.txt) | 
Where-Object { $_ -like 'NAME:*' } | 
Foreach-Object {$_ -replace '(["''])(?:(?=(\\?))\2.)*?\1', $name} | 
Out-File C:\Test_Success.txt 

С Днем программирования!

+0

Это именно то, что я пытаюсь сделать! Спасибо, Джеймс! – Blake

+0

Я забыл звездочку в разделе «-like». Обязательно отметьте ее как принятый ответ. – JamesQMurphy

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