Какова переменная среды для пути к рабочему столу?
Я пишу пакетный файл Windows и хочу скопировать что-то на рабочий стол. Я думаю, что могу использовать это:
%UserProfile%Desktop
однако, я думаю, что, вероятно, будет работать только на английской ОС. Есть ли способ сделать это в пакетном файле, который будет работать на любой интернационализированной версии?
обновление
я попробовал следующий пакетный файл:
REG QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders" /v Desktop
FOR /F "usebackq tokens=3 skip=4" %%i in (`REG QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser 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 "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders" /v Desktop
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders
Desktop REG_EXPAND_SZ %USERPROFILE%Desktop
S:>FOR /F "usebackq tokens=3 skip=4" %i in (`REG QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerUser 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 ответов:
я обнаружил, что лучшим решением является использование 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).
HTH,
Iulian Şerbănoiu
чтобы быть в безопасности, вы должны использовать соответствующие 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
по крайней мере, на 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лично я думаю, что это плохо, когда проецирование ОС.
ответ КБ на использование
[Environment]::GetFolderPath("Desktop")очевидно, официальный API Windows для этого.однако если вы работаете в интерактивном режиме в командной строке, или просто хотите что-то, что работает на вашем компьютере, Тильда (~) символ обозначает домашнюю папку текущего пользователя. Так что
~/desktopв папке рабочего стола пользователя.
Это не только не будет работать для международной версии Windows, но и не сработает, если пользователь отредактировал реестр, чтобы их папка рабочего стола находилась где-то в другом месте. Вы можете запросить реестр для расположения файла с помощью :
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%
вы также можете открыть командную строку DOS и выполнить set.
Это даст вам представление о том, какие переменные среды доступны в вашей системе.
например. - так как вы, где конкретно просят неанглийские окна-heres является примером моего собственного немецкое издание (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
в 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%
Это не решение, но я надеюсь, что это поможет: это близко, за исключением того, что когда ключ = %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%, он не переводится во время команды копирования.
У меня была аналогичная проблема (и 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 позволяет задерживать расширение переменных среды.
хотя я понимаю, что это немного старый пост, я думал, что это может помочь людям в подобной ситуации. Я сделал быструю одну строку 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>"в приведенном выше коде вы можете заменить "Desktop" на любую допустимую специальную папку (Избранное, StartMenu и т. д. - полный официальный список в https://msdn.microsoft.com/en-us/library/0ea7b5xe%28v=vs.84%29.aspx) и
<file_to_copy>с фактическим файлом, который вы хотите разместить там. Это избавляет вас от попыток доступа к реестру (что вы не можете сделать как ограниченный пользователь в любом случае) и должно быть достаточно простым, чтобы адаптироваться к нескольким приложениям.Ну и для тех, кто не знает
"%~dp0"это просто каталог, из которого вызывается скрипт. Он также работает для UNC-путей, что делает пакетный файл используя его чрезвычайно портативный. Это специально заканчивается в трейлинге"\", хотя на первый взгляд это может выглядеть немного странно.
@Дэйв Уэбб является, вероятно, способом пойти. Единственное, что я могу придумать, это CSIDLs:
CSIDL_DESKTOPDIRECTORY
каталог файловой системы, используемый для физически хранить файловые объекты на рабочий стол (который не следует путать с самой папкой рабочего стола). Один типичный путь-это C:\Documents и Settings\имя пользователя\рабочий стол.
Я понятия не имею, как достать их из команды линия, хотя.
многоязычная версия, протестирована на японской ОС
Пакетным Файломset getdesk=REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop
FOR /f "delims=(=" %%G IN ('%getdesk% ^|find "_SZ"') DO set desktop=%%G
set desktop1=%desktop:*USERPROFILE%\=%
cd "%userprofile%\%desktop1%"
set getdesk=
set desktop1=
set desktop=
Это должно работать независимо от того, какая языковая версия Windows это и независимо от того, где находится папка. Также не имеет значения, есть ли пробелы в пути к папке.
FOR /F "tokens=2*" %%A IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop^|FIND/I "desktop"') DO SET Desktop=%%B ECHO %Desktop%в случае Windows 2000 (и, вероятно, NT 4.0) вам нужно скопировать reg.exe в папку %windir% вручную, так как она недоступна там по умолчанию.
Я использую этот код, чтобы получить пути рабочего стола пользователя и общедоступного рабочего стола из реестра, протестированного на Windows XP SP2 pt-PT и Windows 10 b14393 en-US, поэтому он, вероятно, работает в Vista/7/8 и других языках.
:: get user desktop and public desktop paths for /f "tokens=* delims= " %%a in ('reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop ^|find /i "REG_"') do set "batch_userdesktop=%%a" for /f "tokens=* delims= " %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop" ^|find /i "REG_"') do set "batch_publicdesktop=%%a" :: remove everything up to and including "_SZ" set "batch_userdesktop=%batch_userdesktop:*_sz=%" set "batch_publicdesktop=%batch_publicdesktop:*_sz=%% :: remove leading spaces and TABs :loop if "%batch_userdesktop:~0,1%"==" " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop if "%batch_publicdesktop:~0,1%"==" " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loop if "%batch_userdesktop:~0,1%"==" " set "batch_userdesktop=%batch_userdesktop:~1%" & goto loop if "%batch_publicdesktop:~0,1%"==" " set "batch_publicdesktop=%batch_publicdesktop:~1%" & goto loopпоследние две строки включают вкладку внутри" ", некоторые текстовые редакторы добавляют пробелы при нажатии TAB, поэтому убедитесь, что у вас есть фактическая вкладка вместо пробелов.
Я не уверен, что код требует setlocal enabledelayedexpansion, это часть моих SETVARS.УМК который я вызываю из других пакетов, чтобы установить общие переменные, такие как архитектура процессора, язык учетной записи, версия windows и пакет обновления, путь к пользовательскому/общедоступному рабочему столу и т. д.
Я знаю, что это своего рода старая тема, но я бы использовал переменную Powershell
$env:UserProfileиспользовать его, чтобы добраться до рабочего стола, это будет выглядеть так:
cd $env:UserProfile\desktopэто работает как локально, так и удаленно на Windows 7. Надеюсь, это полезно, поскольку я столкнулся с ситуацией, когда клиентская машина не имела значения в $home.
Comments