Удалить пространство между объектами при использовании Write-Host - PullRequest
1 голос
/ 14 октября 2019

У меня есть текстовый файл, который имеет что-то вроде этого:

 Year= YYYY
 Month= MM

Затем я читаю файл, выбираю нужную строку, разделяю ее, чтобы получить только то, что справа отЗнак "=", обрежьте пробелы и поместите все это в переменную с помощью этого кода:

 $Year=Get-Content -Path .\test.txt | Where-Object {$_ -match 'Year='}
 $Year=($Year -Split 'Year=').trim()

Приведенный выше код повторяется для каждой настройки, которую я имею (т. е. Год, Месяц, День, Время).

Когда я помещаю $ Year в командную строку, я получаю «YYYY» (без начального пробела);но когда я использую Write-Host, я получаю "YYYY" (имеет начальный пробел).

Важно, чтобы я мог поместить $ Year $ Month рядом с eathother без пробела для пути к файлу и именования файлов,(т.е. \ YYYY \ MM или YYYYMM.txt).

Я пытался:

 Write-Host "Example: $Year\$Month"
 Write-Host "Example: " $Year "\" $Month
 Write-Host ("Example: $($Year)\$($Month)")
 Write-Host "Example: $Year\" + $Month"
 Write-Host "Example: $Year\" -f $Month"

 ....and several ways of implementing .trim() with no success.

Если проблема не в строке Write-Host, то единственное, что я могуМожно подумать, что это должно быть с тем, как данные записываются в переменные. Пожалуйста, имейте в виду, это только пример, моя реальная проблема больше. Это просто простой пример того, что мне нужно сделать.

БЫСТРОЕ ОБНОВЛЕНИЕ: я нашел длинный обходной путь, подобный следующему:

Write-Host "$Year\" -nonewline
Write-Host "$Month\".trim() -nonewline
Write-Host "$Day\".trim() -nonewline

НО должен быть лучший способ сделать это,Я использую около 8 переменных в моем фактическом коде. Таким образом, дать 1 пример имени файла и пути будет 8 строк в длину ... что было бы глупо.

1 Ответ

2 голосов
/ 14 октября 2019

Проблема в том, что $Year -Split 'Year=' возвращает 2 элементов, а не только строку после Year=.

Немедленное исправление будет:

$Year = ($Year -Split 'Year=')[1].Trim()

В общем, вы можете написать:

$Year = ($Year -split '=', 2)[1].Trim()

Что касается того, что вы пытались :

Если оператор -split находитстрока-разделитель в самом начале строки также предполагает, что то, что предшествует , это первая возвращаемая подстрока, которая является пустой строкой в этомcase.

В вашем случае 'Year= YYYY' -split 'Year=' эффективно возвращает массив '', ' YYYY', а вызов .Trim() для него обрезает отдельные элементы, поэтому вы получите '', 'YYYY'.

Есливы выводите это на консоль через неявный вывод PowerShell , вы можете получить пустую строку , за которой следует YYYY, что также будет, если вы используете Write-Output $Year.

В отличие от этого, если вы используете Write-Host, PowerShell структурирует массив, объединяя его элементы с пробелами (по умолчанию, можно изменить с помощью $OFS), поэтому вы получите YYYY.

Другими словами:

PS> Write-Host ('', 'YYYY')
 YYYY  # concatenation of: empty string, space, 'YYYY'

по умолчанию неявно совпадает с:

PS> Write-Host (('', 'YYYY') -join ' ')
 YYYY
...