Командная строка Windows - Получить перемещенную папку «Документы» пользователя

8

Я пытаюсь написать простой пакетный скрипт, который копирует некоторые файлы из %userprofile%\Documentsкаталога. Я тестирую скрипт на своем компьютере, но после некоторых сбоев я понял, что перенес данные своего пользователя в отдельный раздел . Таким образом, %userprofile%\Documentsявляется пустым , и (очевидно) ничего не копируется.

Я уже пробовал другие переменные окружения, такие как %homedrive%и %homepath%, но они все еще указывают на стандартC:\...

Есть ли способ узнать фактический диск, используемый для данных пользователя?

Я использую Windows 10.

Спасибо!

РЕДАКТИРОВАТЬ

Как указал Ƭᴇcʜιᴇ007, я не перемещал данные пользователя в другой раздел, а просто переместил «основные» папки (Документы, Видео, ...) в некоторые соответствующие папки в другом разделе: щелкните правой кнопкой мыши (например, ) Документы, Свойства, Путь.

Как я могу узнать путь к папке с документами, которая была перемещена таким образом?

Alessandro
источник
2
% userprofile% должен иметь правильную папку независимо от того, где вы ее поместили, если вы правильно переместили папки профиля, она должна быть точной. Так как именно вы переместили его в другой раздел?
Ƭᴇcʜιᴇ007
Хорошо, я, честно говоря, не помню, поэтому немного просмотрел и наконец понял, что я сделал. Я щелкнул правой кнопкой мыши по «основным» папкам («Документы», «Видео» и т. Д.), Выбрал «Свойства», выбрал вкладку «Путь» и изменил путь. (Я использую итальянскую версию Windows, и поскольку я едва перевожу имена, которые вижу на экране, некоторые слова могут отличаться). Итак, вы были правы,% userprofile% на самом деле не делает ничего плохого. Но вопрос все еще: как я могу найти фактический путь к «главной» папке «Документы»?
Алессандро
Тогда я думаю, что вы путаете вашу «библиотеку» документов с папкой «Документы» в вашем профиле пользователя. Две разные вещи ...
Ƭᴇcʜιᴇ007
Есть ли способ узнать путь к папке «Документы», учитывая, что она была перемещена таким образом?
Алессандро

Ответы:

5

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

http://ss64.com/nt/syntax-variables.html

Следует также помнить, что перенаправление папок позволяет даже перемещать их в общий сетевой ресурс. Там не должно быть "диск", который вы можете использовать все; это может быть просто путь UNC.

Хорошей новостью является то, что нужная вам информация доступна в реестре по следующему адресу:

HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки оболочки пользователя \ Личные

В этом User Shell Foldersключе есть целый набор папок, которые вы можете перемещать , но чтение папки «Мои документы» с помощью Windows Batch выглядит следующим образом:

reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal

На моей машине это приводит к следующему выводу, который может быть более или менее полезным для вас в зависимости от того, что вам нужно и насколько вы хороши с пакетными сценариями Windows:

HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки пользовательских оболочек
    Личный REG_EXPAND_SZ C: \ Users \ joel \ Documents

Вы также можете попробовать vbscript:

Set wshshell = CreateObject("WScript.Shell")
Documents = wshShell.SpecialFolders("MyDocuments")

или Powershell:

[Environment]::GetFolderPath('MyDocuments')

Это может в конечном итоге быть доступно через bash в Windows, тоже (правда!), Но я еще не видел, как это сделать так, чтобы это было неизменно точно.

Джоэл Коухорн
источник
3

Предполагая, что у вас есть права на запись в текущую папку или в какое-либо известное место на компьютере ... вы можете использовать PowerShell!

Environment.GetFolderPathФункция может получить файл системного пути хорошо известные мест , в том числе в папке Documents. Эта команда PowerShell печатает путь к документам:

[Environment]::GetFolderPath('MyDocuments')

Его можно записать в файл с помощью Out-Fileкомандлета. Оператор перенаправления >здесь не работает, потому что он создает текстовый файл Unicode с спецификацией, с которым трудно работать в пакетном процессоре.

[Environment]::GetFolderPath('MyDocuments') | Out-File 'docspath.tmp' -Encoding ascii

Этот файл можно прочитать в пакетную переменную с помощью set /p. Собрав все это вместе, мы получим этот фрагмент пакетного скрипта:

powershell -Command "[Environment]::GetFolderPath('MyDocuments') | Out-File 'docspath.tmp' -Encoding ascii"
set /p DOCSPATH=< docspath.tmp
del docspath.tmp

Путь к папке «Документы» пользователя теперь может быть выражен как %DOCSPATH%.

Бен Н
источник
1

У меня есть надежный ответ. Сочетание PowerShell, которое возвращает ответ на DOS

for /f "delims=" %%a in ('powershell.exe -command "& {write-host $([Environment]::GetFolderPath('MyDocuments'))}"') do Set "$Value=%%a"
Echo Value received from Powershell : %$Value%
dcshoecomp
источник
Я не знал, что вы можете использовать $имя переменной CMD. Но вы знаете, что это необычное использование, верно?
Скотт,
0

Ну, это довольно просто :)

Расположение папки рабочего стола указано здесь:

\ HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки оболочки

или даже проще в PowerShell

$ DesktopPath = [Среда] :: GetFolderPath ("Рабочий стол")

integratorIT
источник