Как выписать строку, длина которой зависит от длины записи пользователя?

Я пишу сценарий, который имеет много выходных данных и может принимать несколько имен компьютеров. Выходные данные объявляют имя компьютера, а затем много информации об этом конкретном компьютере. Я хочу иметь серию #s выше и ниже, где он объявляет имя компьютера перед каждым разделом информации, но хотел бы видеть, могу ли я иметь количество #, равное длине предоставленного имени (имен) компьютера. Например:

########
COMPNAME
########

или же

##############
LONGERCOMPNAME
##############

Я предпочел бы не иметь, если еще для каждого возможного случая, таких как

if ($compname.length -eq "8") {
  Write-Host "########"
  Write-Host "$compname"
  Write-Host "########"
} elseif ($compname -eq "9") {
  Write-Host "#########"
  Write-Host "$compname"
  Write-Host "#########"

и так далее. Если мне придется, я буду, это будет всего десять или около того. Или я мог бы просто использовать некоторое количество #s, которые всегда будут охватывать как минимум максимальную длину имени компьютера.

4 ответа

Решение

Вам понравится эта функция PowerShell. Вы можете "умножить" строку.

Попробуй это:

$sep = '@'

Write-Output ($sep*5)

$names = "Hello World", "me too", "goodbye"

$names | % {
Write-Output ($sep*($_.Length))
Write-Output $_
Write-Output ($sep*($_.Length))
}

ВЫХОД

@@@@@
@@@@@@@@@@@
Hello World
@@@@@@@@@@@
@@@@@@
me too
@@@@@@
@@@@@@@
goodbye
@@@@@@@

Вы можете сделать это

$NbChar=5


#method 1 (best)
'@' * $NbChar

#method 2
New-Object  System.String "@", $NbChar

#method 3
-join (1..$NbChar | %{"@"})

#method 4
"".PadLeft($NbChar, '@')

Я бы порекомендовал включить предложение Кори Гилла в пользовательскую функцию, чтобы у вас был простой способ форматирования любого имени:

function Format-ComputerName([string]$ComputerName) {
  $separator = '#' * $ComputerName.Length
  '{0}{1}{2}{1}{0}' -f $separator, [Environment]::NewLine, $ComputerName
}

Или баннер фиксированной ширины:

"{0}`r`n# {1,-76} #`r`n{0}" -f ('#' * 80), $compname;

например:

################################################################################
# LONGERCOMPNAME                                                               #
################################################################################

Вы также можете добавить даты, время и т.д.:

"{0}`r`n# {1:G} : {2,-54} #`r`n{0}" -f ('#' * 80), (Get-Date), $compname;

например:

################################################################################
# 04/02/2017 16:42:07 : LONGERCOMPNAME                                         #
################################################################################

Подробнее о форматировании строки здесь

Другие вопросы по тегам