Как узнать имя текущего пользователя Windows из гостевой Ubuntu?

Рейтинг: 1Ответов: 2Опубликовано: 12.08.2025

ПК под Windows(11). В WSL(2) запускается Ubuntu(24.04). В ней запускается скрипт, которому нужен подкаталог (папка) домашнего каталога текущего пользователя Windows (пользователей несколько). То есть для пользователя Windows user1 скрипт должен использовать find /mnt/c/Users/user1/Pictures/ ..., а для пользователя user2 использовать find /mnt/c/Users/user2/Pictures/ .... Как?

Ответы

▲ 7

Путь к домашней папке windows-юзера находится в windows-переменной USERPOFILE

Эту переменную можно прочитать командой cmd.exe /c 'echo %USERPROFILE%' | tr -d '\r'

Пути Windows можно преобразовать в путь WSL командой wslpath. Итого, как сохранить путь к домашнему каталогу пользователя в переменную WINPROFILE

WINPROFILE=$(wslpath "$(cmd.exe /c 'echo %USERPROFILE%' | tr -d '\r')")

Затем

find "$WINPROFILE/Pictures" ...

UPDATE 1

Как оказалось, если cmd.exe вызывать из каталога, который не является каталогом Windows (я свои примеры запускал в каталоге /c/mnt/Users/User), то cmd.exe начинает ругаться:

$ cmd.exe /c 'echo %USERPROFILE%'
'\\wsl.localhost\Ubuntu\home\user'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
C:\Users\User

Чтобы подавить вывод сообщения об ошибке, то стоит перенаправить stderr в /dev/null:

WINPROFILE=$(wslpath "$(cmd.exe /c 'echo %USERPROFILE%' 2>/dev/null | tr -d '\r')")

Update 2

Довольно опасно рассчитывать, что папка Изображения находится в %USERPROFILE%\Pictures. Она может оказаться где угодно, так как Windows позволяет переносить known-folders внутри файловой системы. Путь к фактическому местоположению этого каталога можно получить из powershell:

powershell.exe -NoProfile -Command "[Environment]::GetFolderPath('MyPictures')"

Сохранить путь к каталогу Изображения текущего пользователя в переменную WINPIC

WINPIC=$(wslpath "$(powershell.exe -NoProfile -Command '[Environment]::GetFolderPath(39)')")

Здесь магическая константа 39 соответствует папке Изображения (aka MyPictures). Вот полный список особых папок, которые поддерживает Environment.GetFolderPath

▲ 3

Альтернативным способом передачи переменной среды из Windows в Linux может быть служебная переменная среды WSLENV. Если присвоить её значение "USERPROFILE/up", то переменная среды USERPROFILE будет перенесена из Windows в Linux с трансляцией формата пути автоматически.

Недостатком данного способа является то, что она должна быть настроена до перехода Windows-Linux, то есть в скрипте на стороне WSL редактировать её уже поздно. Настраивать её проще всего в списке системных переменных:

скриншот

Так же можно использовать пакетный файл на стороне Windows:

@echo off
set WSLENV=%WSLENV%:USERPROFILE/up
wsl путь/к/скрипту