Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
1

Универсальный способ определения расположения пользовательских папок

17.11.2015, 23:43. Показов 693. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую !

Вопрос: как правильно выудить из реестра инфорацию о расположении пользовательских папок ?

на примере рабочего стола
Windows Batch file
1
2
3
4
5
6
@echo off
SetLocal EnableExtensions
 
For /F "Tokens=2*" %%I In ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') Do set DesktopFolder=%%J
echo %DesktopFolder%
pause
Результат для дефолтных значений
%USERPROFILE%\Рабочий стол
или
%USERPROFILE%\Desktop
Зависимости от версии ОС

Вопрос:
Можно ли считать этот способ правильным ?
А конкретно, хотелось бы подстраховаться от наличия в пути русских символов, пробелов и спецсимволов.
Пока косяков не было.

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2015, 23:43
Ответы с готовыми решениями:

Универсальный способ чтения DBF
Есть ли универсальный способ подключения и чтения ДБФ файлов. Который гарантированно запустится на...

Универсальный способ вставить видео на сайте
Какие есть удобные варианты? Да и есть ли они вообще в природе? Или надо костыли накручивать на...

универсальный способ чтения/создания файла
Всем привет! Нужно создать/прочитать в файл в папке C:\Users\user\Desktop\output.txt на...

Универсальный способ проверки группы функций
Добрый день, есть группа методов которые могут возвращать -1. Пример $p->moveTo('1');...

4
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
18.11.2015, 04:51 2
Цитата Сообщение от vavun Посмотреть сообщение
подстраховаться от наличия в пути русских символов,..


Ну если выводится имя "Рабочий стол", то, очевидно, и другие кириллические символы в пути не будут искажаться.




Цитата Сообщение от vavun Посмотреть сообщение
... пробелов...


Чтобы застраховаться от случайных пробелов в конце значения переменной, лучше писать set "DesktopFolder=%%J", хотя и сам часто этим пренебрегаю.

Раскрывать переменную в кавычках: "%DesktopFolder%".




Цитата Сообщение от vavun Посмотреть сообщение
... и спецсимволов.


Тот же принцип -- раскрывать переменную в кавычках.

Для вывода на экран без кавычек можно использовать конструкцию cmd/v/c echo !DesktopFolder!.
2
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
18.11.2015, 05:13  [ТС] 3
А вот еще вопрос по теме: почему происходит вот так, и как с этим бороться ?

Батник в 866
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
SetLocal enableextensions enabledelayedexpansion
 
For /F "delims=" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set "Desktop=%%a"
For /F "tokens=*" %%a in ("%Desktop:*_SZ=%") do call set "DesktopFolder=%%a"
 
MD "%DesktopFolder%\test"
 
pause
Универсальный способ определения расположения пользовательских папок



Тоже в 866
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
SetLocal enableextensions enabledelayedexpansion
 
chcp 1251 >nul
For /F "delims=" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set "Desktop=%%a"
For /F "tokens=*" %%a in ("%Desktop:*_SZ=%") do call set "DesktopFolder=%%a"
chcp 866 >nul
 
MD "%DesktopFolder%\test"
 
pause
Универсальный способ определения расположения пользовательских папок


А на семерке таких исхитрений не требуется.
Чего я не знаю ? )
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
18.11.2015, 10:36 4
vavun, как вариант:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
0</* :
@echo off
  for /f "tokens=*" %%i in ('cscript /nologo /e:jscript "%~f0"') do (
    explorer "%%i"
  )
exit /b
*/0;
(function() {
  with (new ActiveXObject('Shell.Application')) {
    WScript.echo(NameSpace(0x0).Self.Path);
  }
}());
Прыгает на Рабочий стол. На всякий случай константы для NameSpace:
Код
enum {
    ssfDESKTOP = 0,
    ssfPROGRAMS = 2,
    ssfCONTROLS = 3,
    ssfPRINTERS = 4,
    ssfPERSONAL = 5,
    ssfFAVORITES = 6,
    ssfSTARTUP = 7,
    ssfRECENT = 8,
    ssfSENDTO = 9,
    ssfBITBUCKET = 10,
    ssfSTARTMENU = 11,
    ssfDESKTOPDIRECTORY = 16,
    ssfDRIVES = 17,
    ssfNETWORK = 18,
    ssfNETHOOD = 19,
    ssfFONTS = 20,
    ssfTEMPLATES = 21,
    ssfCOMMONSTARTMENU = 22,
    ssfCOMMONPROGRAMS = 23,
    ssfCOMMONSTARTUP = 24,
    ssfCOMMONDESKTOPDIR = 25,
    ssfAPPDATA = 26,
    ssfPRINTHOOD = 27,
    ssfLOCALAPPDATA = 28,
    ssfALTSTARTUP = 29,
    ssfCOMMONALTSTARTUP = 30,
    ssfCOMMONFAVORITES = 31,
    ssfINTERNETCACHE = 32,
    ssfCOOKIES = 33,
    ssfHISTORY = 34,
    ssfCOMMONAPPDATA = 35,
    ssfWINDOWS = 36,
    ssfSYSTEM = 37,
    ssfPROGRAMFILES = 38,
    ssfMYPICTURES = 39,
    ssfPROFILE = 40,
    ssfSYSTEMx86 = 41,
    ssfPROGRAMFILESx86 = 48
} ShellSpecialFolderConstants;
2
10582 / 5545 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
19.11.2015, 00:45  [ТС] 5
А вот еще нюанс, на который не обратил внимания ввиду того, что у меня рабочий стол находится не в дефолтном расположении.

Если использовать
Windows Batch file
1
For /F "Tokens=2*" %%I In ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') Do set DesktopFolder=%%J
Значение параметра HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders Desktop
По умолчанию %USERPROFILE%\Desktop

И переменная DesktopFolder принимает значение %USERPROFILE%\Desktop вместо C:\Users\User\Desktop

А если использовать
Windows Batch file
1
2
For /F "delims=" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set "Desktop=%%a"
For /F "tokens=*" %%a in ("%Desktop:*_SZ=%") do call set "DesktopFolder=%%a"
то таких проблем нет
Почему ?

Добавлено через 5 минут
А, все понял, не туда смотрел. call
0
19.11.2015, 00:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2015, 00:45
Помогаю со студенческими работами здесь

LinqToXML -> TreeView. Есть ли универсальный способ?
.NET 4.0, Windows Forms Application. Есть ли универсальный способ заполнить TreeView данными из...

Создать структуру расположения папок
Доброго времени суток Господа...помогите понять это задание, что примерно нужно в Access...

Перенос пользовательских папок в другое место
Добрый день. Помогите сделать Bat файл который автоматически меняет расположение пользовательских...

Универсальный способ передачи данных из дочернего окна, Родительскому
Есть такой сценарий : Передаётся информация из первого окна во второе, затем из второго в третье. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru