Строка идет с дополнительной новой строкой - PullRequest
0 голосов
/ 30 января 2019

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

Я пытался сделать $erversToReboot.Trim(), но не помогло.

$ServerList = Get-Content "D:\ServerName.txt"
$Servers=""
foreach($Server in $ServerList)
{

        $Servers += $Server + ","

}

[string]$ServersToReboot= $Servers.TrimEnd(",")

Вывод будет

server1,server2
---one extra line here---

Пожалуйста, дайте мне знать, что здесь происходит не так.

Ответы [ 2 ]

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

Как уже отмечали другие, в общем случае гораздо проще использовать оператор -join для объединения строк ввода с указанным разделителем.

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

Возможно, дополнительная строка является артефактом того, как вы печатаете полученное значение.


Ответитьсвязанный с этим вопрос как игнорировать пустые строки во входном файле :

Предполагая, что можно просто удалить все пустые строки из ввода, самый простой PowerShell-идиоматическое решение:

@(Get-Content D:\ServerName.txt) -ne '' -join ','

@(Get-Content D:\ServerName.txt) возвращает входные строки в виде массива [1] строк, из которых
-ne '' затем удаляет пустые строки, ирезультат которого -join соединяется сРазделитель ,


[1] Get-Content D:\ServerName.txt вернет скаляр (одна строка), если входной файл содержит только 1 строка, поскольку PowerShell обычно сообщает один выходной объект как сам , а не как одноэлементный массив , когда конвейерный вывод собран .
Из-за этого @(...), оператор подвыражения массива - вместо просто (...) - необходим в приведенной выше команде: он гарантирует, что вывод из Get-Command обрабатывается как массив , поскольку оператор -ne работает по-разному с скаляром LHS и возвращает Boolean вместо фильтрации элементов LHS: сравните 'foo' -ne '' с @('foo') -ne ''.
Напротив, @(...) является , а не необходимым, если вы передаете результат (напрямую) -join (который просто является no-op со скалярной LHS):
(Get-Content D:\ServerName.txt) -join ','

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

Насколько я могу судить, вы пытаетесь разделить ваши серверы запятыми.Я бы пропустил конструкцию Foreach самостоятельно и просто использовал бы оператор соединения.

$ServerList = Get-Content -Path 'D:\ServerName.txt'
$ServerList -join ','

Это также можно сделать в одном выражении.

$ServerList = (Get-Content -Path 'D:\ServerName.txt') -join ','

Tommy

...