it-swarm.com.de

Wie lautet die Umgebungsvariable für den Pfad zum Desktop?

Ich schreibe eine Windows-Batchdatei und möchte etwas auf den Desktop kopieren. Ich denke ich kann das verwenden:

% UserProfile%\Desktop \ 

Ich denke jedoch, das wird wahrscheinlich nur auf einem englischen Betriebssystem funktionieren. Gibt es eine Möglichkeit, dies in einer Batchdatei zu tun, die mit jeder internationalisierten Version funktioniert?

UPDATE

Ich habe folgende Batchdatei ausprobiert:

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%

Und bekam diese Ausgabe:

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

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


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

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

 S: \> SET DESKTOPDIR = ECHO ist an .

 S: \> ECHO ECHO ist an .
 ECHO ist an .
55
Scott Langham

Ich habe festgestellt, dass die beste Lösung darin besteht, ein Vbscript zusammen mit der Batchdatei zu verwenden.

Hier ist die Batchdatei:

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

Hier finden Sie die Datei findDesktop.vbs:

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

Es kann andere Lösungen geben, aber ich persönlich finde diese weniger hackig.

Ich habe dies auf einem englischen und einem französischen PC getestet - es scheint zu funktionieren (Windows XP).

HTH,

Iulian Şerbănoiu

14
INS

Um sicher zu gehen, sollten Sie die richtigen APIs in Powershell (oder VBScript) verwenden.
Verwenden von PowerShell:

[Environment]::GetFolderPath("Desktop")

Kopieren Sie etwas mit Powershell:

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

Hier ist ein VBScript-Beispiel, um den Desktoppfad abzurufen:

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
54
Kb.

Die Antwort von KB auf [Environment]::GetFolderPath("Desktop") ist natürlich die offizielle Windows-API.

Wenn Sie jedoch interaktiv an der Eingabeaufforderung arbeiten oder einfach etwas möchten, das auf Ihrem Computer funktioniert, bezieht sich das Zeichen tilda (~) auf den Heimatordner des aktuellen Benutzers. ~/desktop ist also der Desktopordner des Benutzers.

14
Saqib

Zumindest unter Windows XP, Vista und 7 können Sie den "%UserProfile%\Desktop" sicher verwenden.

Windows XP en-US erweitert sich auf "C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR erweitert sich zu "C:\Documents and Settings\YourName\Desktop"
Windows 7 de-US erweitert sich auf "C:\Users\YourName\Desktop"
Windows 7 pt-BR erweitert sich zu "C:\Usuarios\YourName\Desktop"

Unter XP können Sie diese Option nicht für andere Ordner verwenden, außer für Desktop My documents und Meus Documentos und Local Settings in Configuracoes locais. Ich denke, das ist eine schlechte Sache, wenn Sie ein Betriebssystem projizieren.

14
Vitim.us

Dies würde nicht nur für eine internationale Windows-Version nicht funktionieren, es würde auch fehlschlagen, wenn der Benutzer die Registrierung so bearbeitet hätte, dass der Desktop-Ordner an einem anderen Ort gespeichert wird. Sie können die Registry nach dem Speicherort der Datei mit dem Befehl REG abfragen:

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

Um dies in eine Variable zu bekommen, verwenden Sie etwas wie folgt:

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%
6
Dave Webb

sie können auch eine DOS-Befehlseingabeaufforderung öffnen und den Befehl set ausführen.

Dadurch erhalten Sie eine Vorstellung davon, welche Umgebungsvariablen in Ihrem System verfügbar sind.

Z.B. - da Sie ausdrücklich nach einem nicht-englischen Windows gefragt haben - ist hier ein Beispiel meiner eigenen German Edition (Window7-64bit) :

 set> env.txt 
 Typ env.txt 

 ALLUSERSPROFILE = C:\Programmdaten 
 APPDATA = C:\Benutzer\SOF\AppData\Roaming 
 CommonProgramFiles = C:\Programme\Gemeinsame Dateien 
 CommonProgramFiles (x86) = C:\Programme (x86)\Gemeinsame Dateien 
 CommonProgramW6432 = C:\Programme\Gemeinsame Dateien 
 COMPUTERNAME = VMSOF 
 ComSpec = C:\Windows\system32\cmd.exe 
 FP_NO_Host_CHECK = NO 
 HOMEDRIVE = C: 
 HOMEPATH =\Benutzer\SOF 
 LOCALAPPDATA = C:\Benutzer\SOF\AppData\Local 
 LOGONSERVER = \\ VMSOF 
 NUMBER_OF_PROCESSORS = 2 
 OS = Windows_NT 
 Pfad = C:\Windows\system32; C:\Windows; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0 \; C:\Programme\TortoiseSVN\bin; C:\Programme (x86)\CMake 2.8\bin; C:\Programme (x86)\emacs-22.3\bin; C:\Programme ( x86)\GnuWin32\bin; __. PATHEXT = .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC 
 PROCESSOR_ARCHITECTURE = AMD64 
 PROCESSOR_IDENTIFIER = AMD64-Familie 15 Modell 67 Schritt 3, AuthenticAMD 
 PROCESSOR_LEVEL = 15 
 PROCESSOR_REVISION = 4303 
 ProgramData = C :\ProgramData 
 ProgramFiles = C:\Programme 
 ProgramFiles (x86) = C:\Programme (x86) 
 ProgramW6432 = C:\Programme 
 Eingabeaufforderung = $ P $ G 
PSModulePath = C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
 PUBLIC = C:\Users\Public 
 SESSIONNAME = Konsole 
 SystemDrive = C: 
 SystemRoot = C:\Windows 
 TEMP = C:\Benutzer\SOF\AppData\Local\Temp 
 TMP = C:\Users\SOF\AppData\Local\Temp 
 USERDOMAIN = VMSOF 
 USERNAME = SOF 
 USERPROFILE = C:\Benutzer\SOF 
 VBOX_INSTALL_PATH = C:\Programme\Sun\VirtualBox\
 VS90COMNTOOLS = C:\Programme (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
 Windir = C:\Windows 

4
anon

in Windows 7 wird der Desktoppfad zurückgegeben:

 FOR/F "usebackq tokens = 3" %% i in (`REG QUERY 'HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell-Ordner"/v Desktop ") SET DESKTOPDIR = %% i __. FOR/F "usebackq delims =" %% i in (`ECHO% DESKTOPDIR% ') SET DESKTOPDIR = %% i 
 ECHO% DESKTOPDIR% 
3
Osama Rajab

Obwohl mir klar ist, dass dies ein etwas älterer Beitrag ist, dachte ich, dass dies Menschen in einer ähnlichen Situation helfen könnte. Ich habe ein kurzes, einzeiliges VBScript erstellt, um Informationen für jeden speziellen Ordner abzurufen (keine Fehlerüberprüfung) und es funktioniert folgendermaßen:

Erstellen Sie eine Datei "GetShellFolder.vbs" mit der folgenden Zeile:

WScript.Echo WScript.CreateObject("WScript.Shell").SpecialFolders(WScript.Arguments(0))

Ich vergewissere mich immer, cscript.exe (32-Bit-Version) in den gleichen Ordner wie die Batchdatei zu kopieren, von der aus ich das ausführte. Ich gehe davon aus, dass Sie dasselbe tun (ich hatte Situationen, in denen Benutzer C:\irgendwie entfernt haben.) Windows\system32 von ihrem Pfad aus, oder es ist gelungen, cscript.exe zu entfernen, oder es ist infiziert oder funktioniert nicht).

Kopieren Sie nun die zu kopierende Datei in denselben Ordner und erstellen Sie dort eine Stapeldatei mit den folgenden Zeilen:

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>"

Im obigen Code können Sie "Desktop" durch einen beliebigen gültigen Ordner (Favoriten, StartMenü usw.) ersetzen. Die vollständige offizielle Liste finden Sie unter https://msdn.Microsoft.com/de-de/library/0ea7b5xe%28v = vs.84% 29.aspx ) und natürlich <file_to_copy> mit der tatsächlichen Datei, die Sie dort ablegen möchten. Dies erspart Ihnen den Zugriff auf die Registrierung (was Sie nicht als eingeschränkte Benutzer ohnehin tun können) und sollte einfach genug sein, um sich an mehrere Anwendungen anzupassen.

Oh, und für diejenigen, die "%~dp0" nicht kennen, ist nur das Verzeichnis, aus dem das Skript aufgerufen wird. Es funktioniert auch für UNC-Pfade, wodurch die Batch-Datei extrem portierbar ist. Das endet spezifisch in einem nachlaufenden "\", kann jedoch auf den ersten Blick ein wenig seltsam aussehen.

2
Improv

Dies ist keine Lösung, aber ich hoffe, es hilft: Das kommt in der Nähe, außer dass die Kopie bei KEY =% userprofile%\desktop fehlschlägt, obwohl zdesktop =% userprofile%\desktop. Ich denke, weil das eingebettete% userprofile% nicht übersetzt wird.

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

Es analysiert also erfolgreich den REG-Schlüssel, aber wenn der Schlüssel ein eingebettetes% var% enthält, wird er während des Kopierbefehls nicht übersetzt.

2
fupsduck

Ich hatte ein ähnliches Problem (und VBScript oder PowerShell war keine Option) und der in diesem Artikel gefundene Code funktionierte nicht für mich. Ich hatte Probleme mit Betriebssystemversionen und Sprachversionen. Nach einigen Experimenten bin ich zu dieser Lösung gekommen:

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

Dieser Code funktioniert für mich in englischen und polnischen Versionen von Windows 7 und Windows XP.

Die: reparse-Subroutine ermöglicht die verzögerte Erweiterung von Umgebungsvariablen.

2
MBu

Ich verwende diesen Code, um den Benutzerdesktop und die Pfade des öffentlichen Desktops aus der Registrierung abzurufen, die unter Windows XP SP2 pt-PT und Windows 10 b14393 de-US getestet wurden, sodass er wahrscheinlich in Vista/7/8 und anderen Sprachen funktioniert .

:: 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

Die letzten beiden Zeilen enthalten eine TAB im "". Einige Texteditoren fügen Leerzeichen hinzu, wenn Sie die Tabulatortaste drücken. Stellen Sie also sicher, dass Sie eine tatsächliche TAB anstelle von Leerzeichen haben.

Ich bin nicht sicher, ob der Code setlocal enabledelayedexpansion benötigt, er ist Teil meiner SETVARS.CMD, die ich aus anderen Batches aufrufe, um allgemeine Variablen wie CPU-Architektur, Kontosprache, Windows-Version und Service Pack, Pfad zum Benutzer/öffentlichen Desktop usw. festzulegen.

1
Johnye

Die Antwort von @Dave Webb ist wahrscheinlich der richtige Weg. Das einzige, was mir einfällt, sind die CSIDLs :

CSIDL_DESKTOPDIRECTORY 

Das Dateisystemverzeichnis, das für .__ verwendet wurde. Dateiobjekte physisch auf der .__ speichern. Desktop (der nicht mit dem Desktop-Ordner selbst verwechselt werden sollte.). EIN Ein typischer Pfad ist C:\Documents und Einstellungen\Benutzername\Desktop.

Ich habe keine Ahnung, wie ich sie von der Kommandozeile aus erreichen kann.

1
Pekka 웃

Dies sollte funktionieren, unabhängig von der Sprachversion von Windows und unabhängig davon, wo sich der Ordner befindet. Es spielt auch keine Rolle, ob der Ordnerpfad Leerzeichen enthält.

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%

Im Falle von Windows 2000 (und wahrscheinlich NT 4.0) müssen Sie reg.exe manuell in den Ordner% windir% kopieren, da es dort standardmäßig nicht verfügbar ist.

1
tomasz86

Mehrsprachige Version, getestet auf japanischem Betriebssystem
Batchdatei

 set getdesk = REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell-Ordner"/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 =
1
Josh

Ich weiß, dass dies ein altes Thema ist, aber ich würde die Powershell-Variable verwenden 

$env:UserProfile 

Um damit zum Desktop zu gelangen, wäre das:

cd $env:UserProfile\desktop

Dies funktioniert sowohl lokal als auch remote unter Windows 7. Ich hoffe, das ist nützlich, da ich auf eine Situation gestoßen bin, in der ein Client-Computer keinen Wert in $ home hatte.

0
Gearhead351