#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($_) }