Хотя я понимаю, что это немного более старый пост, я подумал, что это может помочь людям в подобной ситуации. Я сделал быстрый однострочный VBScript для извлечения информации для любой специальной папки (без проверки ошибок), и она работает так:
Создайте файл «GetShellFolder.vbs» со следующей строкой:
WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders(WScript.Arguments(0))
Я всегда проверяю, чтобы скопировать cscript.exe (32-разрядная версия) в ту же папку, что и пакетный файл, из которого я запускаю этот файл, я предполагаю, что вы делаете то же самое (у меня были ситуации, когда пользователи каким-то образом удаляли C: \ Windows \ system32 с их пути, либо удалось избавиться от cscript.exe, либо он заражен, либо не работает).
Теперь скопируйте файл для копирования в ту же папку и создайте там командный файл со следующими строками:
for /f "delims=" %%i in ('^""%~dp0cscript.exe" "%~dp0GetShellFolder.vbs" "Desktop" //nologo^"') DO SET SHELLDIR=%%i
copy /y "%~dp0<file_to_copy>" "%SHELLDIR%\<file_to_copy>"
В приведенном выше коде вы можете заменить «Рабочий стол» на любую допустимую специальную папку («Избранное», StartMenu и т. Д.) - полный официальный список находится по адресу https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs.84%29.aspx) и, конечно, <file_to_copy>
на нужный файл. размещен там. Это избавляет вас от попыток получить доступ к реестру (что в любом случае вы не можете сделать как пользователь с ограниченными правами) и должен быть достаточно простым для адаптации к нескольким приложениям.
Да, а для тех, кто не знает, "%~dp0"
- это просто каталог, из которого вызывается скрипт. Он работает и для путей UNC, что делает пакетный файл, использующий его, чрезвычайно переносимым. Это, в конце концов, заканчивается завершающим "\", хотя на первый взгляд может показаться немного странным.