Какая переменная среды для пути к рабочему столу? - PullRequest
59 голосов
/ 04 января 2010

Я пишу командный файл Windows и хочу скопировать что-нибудь на рабочий стол. Я думаю, что могу использовать это:

% UserProfile% \ Desktop \

Однако, я думаю, это, вероятно, будет работать только на английской ОС. Есть ли способ, которым я могу сделать это в командном файле, который будет работать на любой международной версии?

UPDATE

Я пробовал следующий командный файл:

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

И получил этот вывод:

S:\>REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    Desktop    REG_EXPAND_SZ    %USERPROFILE%\Desktop


S:\>FOR /F "usebackq tokens=3 skip=4" %i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folder
s" /v Desktop`) DO SET DESKTOPDIR=%i

S:\>FOR /F "usebackq delims=" %i in (`ECHO ECHO is on.`) DO SET DESKTOPDIR=%i

S:\>SET DESKTOPDIR=ECHO is on.

S:\>ECHO ECHO is on.
ECHO is on.

Ответы [ 15 ]

55 голосов
/ 04 января 2010

Чтобы быть в безопасности, вы должны использовать соответствующие API в Powershell (или VBScript)
Использование PowerShell:

[Environment]::GetFolderPath("Desktop")

Скопируйте что-нибудь с помощью Powershell:

Copy-Item $home\*.txt ([Environment]::GetFolderPath("Desktop"))

Вот пример VBScript для получения пути к рабочему столу:

dim WSHShell, desktop, pathstring, objFSO
set objFSO=CreateObject("Scripting.FileSystemObject")
Set WSHshell = CreateObject("WScript.Shell")
desktop = WSHShell.SpecialFolders("Desktop")
pathstring = objFSO.GetAbsolutePathName(desktop)
WScript.Echo pathstring
14 голосов
/ 29 октября 2012

По крайней мере, в Windows XP, Vista и 7 вы можете безопасно использовать "%UserProfile%\Desktop".

Windows XP en-US расширится до "C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR расширится до "C:\Documents and Settings\YourName\Desktop"
Windows 7 en-US расширится до "C:\Users\YourName\Desktop"
Windows 7 pt-BR расширится до "C:\Usuarios\YourName\Desktop"

В XP вы не можете использовать это для других папок, кроме рабочего стола My documents поворачивается к Meus Documentos и Local Settings к Configuracoes locais Лично я считаю, что это плохо при проектировании ОС.

14 голосов
/ 19 апреля 2010
Ответ

KB на использование [Environment]::GetFolderPath("Desktop"), очевидно, является официальным Windows API для этого.

Однако, если вы работаете в интерактивном режиме по приглашению или просто хотите что-то, что работает на вашем компьютере, символ тильды (~) относится к домашней папке текущего пользователя. Таким образом, ~/desktop - папка рабочего стола пользователя.

14 голосов
/ 15 апреля 2010

Я обнаружил, что лучшее решение - использовать vbscript вместе с командным файлом.

Вот командный файл:

@ECHO OFF
FOR /F "usebackq delims=" %%i in (`cscript findDesktop.vbs`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%

Вот файл findDesktop.vbs:

set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
wscript.echo(strDesktop)

Могут быть и другие решения, но лично я считаю это менее хакерским.

Я проверил это на английском и французском ПК - похоже, он работает (Windows XP).

НТН,

Юлиан Шербаною

6 голосов
/ 04 января 2010

Мало того, что это не сработает для международной версии Windows, оно не будет работать, если пользователь отредактировал реестр, чтобы его папка Desktop находилась где-то еще. Вы можете запросить реестр о расположении файла, используя команду REG:

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop

Чтобы передать это в переменную, используйте что-то вроде этого:

FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i
ECHO %DESKTOPDIR%
4 голосов
/ 04 января 2010

Вы также можете открыть командную строку DOS и выполнить команду set .

Это даст вам представление о том, какие переменные среды доступны в вашей системе.

например. - поскольку вы специально просили неанглийскую Windows - вот пример моего немецкого издания (Window7-64bit) :

set > env.txt
type env.txt

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\SOF\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=VMSOF
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\SOF
LOCALAPPDATA=C:\Users\SOF\AppData\Local
LOGONSERVER=\\VMSOF
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\CMake 2.8\bin;C:\Program Files (x86)\emacs-22.3\bin;C:\Program Files (x86)\GnuWin32\bin;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=AMD64 Family 15 Model 67 Stepping 3, AuthenticAMD
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=4303
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\SOF\AppData\Local\Temp
TMP=C:\Users\SOF\AppData\Local\Temp
USERDOMAIN=VMSOF
USERNAME=SOF
USERPROFILE=C:\Users\SOF
VBOX_INSTALL_PATH=C:\Program Files\Sun\VirtualBox\
VS90COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
windir=C:\Windows

3 голосов
/ 21 сентября 2011

в windows 7 возвращает путь к рабочему столу:

FOR /F "usebackq tokens=3 " %%i in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop`) DO SET DESKTOPDIR=%%i 
FOR /F "usebackq delims=" %%i in (`ECHO %DESKTOPDIR%`) DO SET DESKTOPDIR=%%i 
ECHO %DESKTOPDIR% 
2 голосов
/ 23 марта 2016

Хотя я понимаю, что это немного более старый пост, я подумал, что это может помочь людям в подобной ситуации. Я сделал быстрый однострочный 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, что делает пакетный файл, использующий его, чрезвычайно переносимым. Это, в конце концов, заканчивается завершающим "\", хотя на первый взгляд может показаться немного странным.

2 голосов
/ 09 января 2012

У меня была похожая проблема (а VBScript или PowerShell не было вариантом), и код, который я нашел в этой статье, не работал для меня У меня были проблемы с версиями ОС и языковыми версиями. После некоторых экспериментов я пришел к этому решению:

for /f "usebackq tokens=2,3*" %%A in (`REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop"`) do if %%A==REG_EXPAND_SZ call :reparse set desktopdir=%%B
echo %desktopdir%
goto :EOF

:reparse
%*
goto :EOF

Этот код работает для меня в английской и польской версиях Windows 7 и Windows XP.

Подпрограмма: reparse допускает отложенное расширение переменных среды.

2 голосов
/ 04 января 2010

Это не решение, но я надеюсь, что оно поможет: это близко, за исключением того, что когда KEY =% userprofile% \ desktop, копия не выполняется, даже если zdesktop =% userprofile% \ desktop. Я думаю, потому что встроенный% userprofile% не переводится.

REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop>z.out
for /f "tokens=3 skip=4" %%t in (z.out) do set zdesktop=%%t
copy myicon %zdesktop%
set zdesktop=
del z.out

Таким образом, он успешно разбирает ключ REG, но если ключ содержит внедренный% var%, он не переводится во время команды копирования.

...