Поиск и замена, если переменная приглашения read-host найдена - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь создать скрипт, который в основном ищет строку, а затем заменяет ее другой строкой. Обе строки будут храниться в виде переменных и создаются при запуске сценария с использованием «Read-Host -Prompt». Моя проблема в нижней части сценария; Я хочу, чтобы скрипт искал строку EXACT, введенную пользователем, '-match', кажется, выполняет поиск по шаблону. Кроме того, в моем операторе if отлично работает Write-Host, когда пользовательский ввод найден, но когда я пытаюсь добавить код -replace, под которым он сообщает, что есть значение nullValue.

Вот мой код:

# Copy device.txt, append today's date, move to backup folder
$sourcePath = 'C:\path\to\source\file\file.txt'
$destPath = 'C:\path\to\source\file\Backup\file_' + (Get-Date -Format yyyyMMdd)+'.txt'
Copy-Item -Path $sourcePath -Destination $destPath
Write-Host 'File has been copied to backup folder'

#Ask for user input on old ID vs new ID
$oldDeviceId = Read-Host -Prompt "What is the old device ID you're replacing?"
$newDeviceId = Read-Host -Prompt "What is the new device ID?"

#Check for a match on $oldDeviceId
$sourceFile = (Get-Content 'C:\path\to\source\file\file.txt')
$sfContainsOdi = $sourceFile | ForEach-Object {$_ -match $oldDeviceId}

#If $oldDeviceId is found, replace with $newDeviceId
if ($sfContainsOdi -contains $true) {
    Write-Host "Found $oldDeviceId"
    $replaceString = $replaceString -replace ($oldDeviceId, $newDeviceId)
} else {
    Write-Host "Could not find $oldDeviceId, please make sure you've input the correct device ID"
}

Я не уверен, как добавить -replace в мое заявление if.

Edit:
Когда я запустил предложение @Ansgar Wiechers, замены не было. Вот пример содержимого моего файла:

QWER147,/qwer=nmsdf/asdf=A1
ASDF258,/qwer=jkl /asdf=A1
ZXCV369,/qwer=yuio /asdf=A1

Иногда идентификатор в первом столбце необходимо изменить. Например, я пытаюсь изменить / заменить «QWER147» из приведенного выше списка новым идентификатором, например «QWER159».

1 Ответ

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

Оператор -match (а также оператор -replace) выполняет совпадения регулярного выражения , а не совпадения с подстановочными знаками.Кроме того, вы нигде не определяете $replaceString, прежде чем использовать его в этом операторе:

$replaceString = $replaceString -replace ($oldDeviceId, $newDeviceId)

Поскольку вы, похоже, хотите работать с простыми строковыми операциями, я бы рекомендовал использовать соответствующие строковые методы вместоОператоры PowerShell.

$sourceFile    = Get-Content 'C:\path\to\source\file.txt'
$sfContainsOdi = $sourceFile | Where-Object { $_.Contains($oldDeviceId) }

if ($sfContainsOdi) {
    Write-Host "Found $oldDeviceId"
    $replaceString = $sourceFile.Replace($oldDeviceId, $newDeviceId)
} else {
    Write-Host "Could not find $oldDeviceId, please make sure you've input the correct device ID"
}

Вы можете использовать $sfContains0di непосредственно в качестве условия при фильтрации содержимого файла с помощью Where-Object, поскольку PowerShell оценит пустое значение как $false и непустое значение для $true (есть некоторые предостережения , но они, скорее всего, не будут применяться в вашем случае).

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