Powershell «Документы» или «Мои документы»

#powershell

#powershell

Вопрос:

Кто-нибудь может объяснить, почему с помощью чего-то вроде:

 gci -force "\computernamec$usersusernameDocuments" -recurse
  

или

 gci -force "\computernamec$usersusernameMy Documents" -recurse
  

При просмотре выходных данных он фактически возвращает:

 "\computernamec$usersusernameMy Documents"
"\computernamec$usersusernameMy DocumentsMy Pictures"
"\computernamec$usersusernameMy DocumentsMy Music"
  

И т.д.?

«Моя музыка» и «Мои картинки» не находятся в этом расположении, но «Документы» или «Мои документы», похоже, сообщают обо всех этих папках.

Однако, если я использую «каталог», он возвращает ТОЛЬКО файлы, которые физически находятся в разделе «Мои документы». Кроме того, если я gci «Мои фотографии», он возвращает ТОЛЬКО содержимое «Мои фотографии», я знаю, что различные папки профиля являются специальными папками, но есть ли способ ПРОСТО вернуть содержимое «Мои документы».

Мой скрипт в основном анализирует профили пользователей и возвращает размер всех компьютеров при подготовке к перенаправлению профилей.

Таким образом, результат всегда выглядит примерно так:

 Scanning users ........... testuser
.......................... My Documents => 500 MB
.......................... My Pictures  => 500 MB
.......................... My Videos => 0 MB
.......................... Downloads => 0 MB
.......................... Total => 1000 MB
  

Итак, в примере «Всего» на самом деле просто сообщает о 500 МБ изображений, одно в «Мои изображения» и один раз в «Мои документы»

Ответ №1:

Принятый ответ на самом деле неверен. Это работает, если папка «Документы пользователя» находится в расположении по умолчанию, но не в том случае, если папка «Документы» была сопоставлена с другим расположением. Например, если у вас SSD-накопитель меньшего размера, вы можете сопоставить папку «Документы» с другим диском, или организация может сопоставить папку «Документы пользователя» с общим сетевым ресурсом.

Правильный способ получить папку документов пользователя в Powershell — это [environment]::getfolderpath("mydocuments") which вернет сопоставленное местоположение.

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

1. Спасибо, что вы держите меня честным. Я обновил свой ответ, включив в него то, что вы предложили, просто чтобы убедиться, что люди видят это, а не просто останавливаются на «принятом ответе» и пропускают ваш. Я позаботился о том, чтобы отдать вам должное.

Ответ №2:

Это не зависит от powershell, это связано с тем, что Windows 7 имеет соединения в любом профиле в папке «Документы» для «Моя музыка», «Мои изображения» и «Мои видео». Это можно увидеть, вызвав командную строку, перейдя к папке «Документы» и выполнив DIR /AD команду, которая покажет вам эти соединения.

Чтобы избежать этой проблемы в PowerShell, не используйте параметр -Force , и он не должен включать соединения.

Это поведение можно увидеть, выполнив то же самое и в PowerShell, если вы предпочитаете, выполнив GCI $env:UserProfileDocuments и отметив, что для трех соединенных папок нет списка, а затем проделав то же самое, но добавив -Force к нему и отметив, что эти три теперь отображаются.

Как указал Роб Прууз, это работает только в том случае, если папка «Документы пользователя» находится в расположении по умолчанию. Если он был перенаправлен куда-то еще, он не приведет вас к перенаправленному местоположению. Это работает для первоначальной проблемы OP, поскольку они, очевидно, просматривали местоположение по умолчанию, но для других пользователей вы захотите получить путь с помощью [environment]::GetFolderPath('MyDocuments')

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

1. Ах, конечно! Честно говоря, я беру этот сценарий, который я написал несколько месяцев назад, я не могу вспомнить, почему я вообще использую force. Я проверю это сейчас и отмечу как ответ после подтверждения

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

Ответ №3:

При этом будет создан список всех элементов специальной папки.

 ([Environment SpecialFolder]).GetEnumValues() |
    ForEach-Object { '{0} === {1}' -f $_, [Environment]::GetFolderPath($_) }