Как в командной строке Windows извлечь значение файла свойств и сохранить его в переменной среды env?

#powershell #makefile #windows-10 #environment-variables #properties-file

#powershell #makefile #windows-10 #переменные среды #свойства-файл

Вопрос:

У меня есть файл свойств с записями, подобными приведенным ниже…

 ...
USERNAME=myuser
...
 

В моем Makefile у меня есть приведенный ниже, который использует Unix-подобные команды для получения значения переменных…

 export USERNAME=$(shell grep USERNAME my_properties.txt | cut -d'=' -f 2-)
 

Однако в командной строке Windows power shell (возможно, правильная фраза «командная строка»?), Приведенное выше, не работает, потому что «grep» не является стандартной командой (среди прочих). Каков эквивалентный способ извлечения свойства из файла свойств в среде командной строки Windows?

Комментарии:

1. Спасибо за согласие; оказывается -ExecutionPolicy Bypass , это было ненужным, но -NoProfile желательно — пожалуйста, посмотрите Мое обновление.

Ответ №1:

Мы могли бы добиться этого в PowerShell, выполнив следующие действия

  1. Прочитайте содержимое файла
  2. Преобразуйте содержимое в пары ключ-значение
  3. Создайте переменную среды с требуемым значением

(вы можете объединить шаги, если хотите, я сохранил их отдельно для лучшего понимания)

Вот сценарий

 $content = Get-Content .user.properties -raw
$hashTable = ConvertFrom-StringData -StringData $content
$Env:USERNAME = $hashTable.USERNAME
 

Комментарии:

1. ответ @mklement0, в котором используются ‘select-string’ и ‘split’, обеспечивает более близкий эквивалент команд ‘grep’ и ‘cut’

Ответ №2:

Предполагая, что cmd.exe это оболочка по умолчанию:

 export USERNAME=$(shell powershell -noprofile -c "(Select-String 'USERNAME=(. )' my_properties.txt).Matches.Group[1]")
 

Примечание: -NoProfile подавляет загрузку профилей PowerShell, что, к сожалению, происходит по умолчанию. Если вам нужен -File параметр для выполнения файла сценария, он может потребоваться дополнительно -ExecutionPolicy Bypass , если только ваша эффективная политика выполнения не разрешает выполнение сценария.

В приведенном выше примере для передачи команды, использующей командлет, аналог PowerShell, используется параметр -c командной -Command строки PowerShell () Select-String grep .


Более близким аналогом вашей команды было бы следующее, в котором дополнительно используется -split оператор разделения строк (отображается только необработанная команда PowerShell; поместите ее внутрь приведенного "..." выше):

 ((Select-String USERNAME my_properties.txt) -split '=', 2)[-1]