Извлечение символов из операции powershell для передачи в другую функцию
#Where $ConfigPath = C:\App\Place\whatever.xml
$AirportCode =
[System.IO.File]::ReadAllText($ConfigPath).Replace("%Airport_Code%","LHR")
[System.IO.File]::WriteAllText($ConfigPath,$AirportCode)
$SystemID = [System.IO.File]::ReadAllText($ConfigPath).Replace("%System_ID%",$Env:COMPUTERNAME)
[System.IO.File]::WriteAllText($ConfigPath,$SystemID)
Таким образом, этот фрагмент powershell читает файл XML, а затем заменяет заполнитель%Airport_Code% текстом статического обозначения аэропорта. В данном случае London Heathrow или LHR. Поскольку наши соглашения об именах содержат первые три символа того, что находится в ближайшем аэропорту... вместо того, чтобы иметь статическое значение для этой замены, я хотел бы найти способ для powershell извлечь первые три символа из имени системы и поменять местами это статическое значение для системного имени вместо значения..
Следующий бит сканирует тот же XML-файл и заменяет%System_ID% на текущее имя системы, используя переменную $Env:COMPUTERNAME... В настоящее время скрипт работает, как показано выше.
Вопрос: Как я могу извлечь первые три символа из вывода $Env:Computername и передать его в первый раздел так, чтобы текущее значение LHR изменилось на первые 3 символа любого системного имени.. (потому что мы используйте 3 обозначения аэропортов в рамках нашего соглашения об именах.)
2 ответа
Если вы пытаетесь просто получить первые 3 буквы имени компьютера и указать функцию, которую вы можете выполнить:
Function SomeFunction{
[cmdletbinding()]
param(
[parameter(ValueFromPipeline)]
[string]$Id
)
$Id
}
($Env:COMPUTERNAME).Substring(0,3) | SomeFunction
Подстрока получает 3 символа (Подстрока (начальный индекс, Сколько символов)), The | передает 3 символа функции SomeFunction. [Cmdletbinding] позволяет использовать конвейер в функции, а [параметр (ValueFromPipeline)] сообщает, какой параметр будет принимать данные канала.
Хотя не рекомендуется использовать замены строк в исходном коде XML, я думаю, что в этом случае это вполне законно, потому что вы хорошо подготовили xml с заполнителями. В любом случае, почему бы не заменить оба заполнителя за один раз, например:
$newConfig = (Get-Content -Path $ConfigPath -Raw) -replace '%Airport_Code%', ($Env:COMPUTERNAME.Substring(0,3).ToUpper()) `
-replace '%System_ID%', $Env:COMPUTERNAME
$newConfig | Set-Content $ConfigPath -Force
Ps Обратите внимание на 'backtick' после первой строки кода. Это означает, что линия продолжается. Я просто вставил его для удобства чтения, но для PowerShell это всего одна строка кода:
$newConfig = (Get-Content -Path $ConfigPath -Raw) -replace '%Airport_Code%', ($Env:COMPUTERNAME.Substring(0,3).ToUpper()) -replace '%System_ID%', $Env:COMPUTERNAME