web-dev-qa-db-ja.com

デスクトップへのパスの環境変数は何ですか?

Windowsバッチファイルを作成していて、デスクトップに何かをコピーしたい。私はこれを使用できると思います:

%UserProfile%\ Desktop \

ただし、それはおそらく英語OSでしか機能しないと考えています。国際化バージョンで動作するバッチファイルでこれを行う方法はありますか?

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( `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はオン。
 
 S:\> ECHO ECHOはオンです。
 ECHOはオンです。
59
Scott Langham

バッチファイルと共に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)

他の解決策もあるかもしれませんが、私は個人的にはこれがそれほどハック的ではないと思います。

これを英語のPCとフランス語のPCでテストしました-動作するようです(Windows XP)。

HTH、

ユリアン・セルバノイウ

14
INS

安全のために、Powershell(またはVBScript)で適切なAPIを使用する必要があります
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
55
Kb.

[Environment]::GetFolderPath("Desktop")を使用するというKBの答えは、明らかにこれを行うための公式のWindows APIです。

ただし、プロンプトでインタラクティブに作業している場合、または単にマシン上で動作するものが必要な場合は、チルダ(〜)文字は現在のユーザーのホームフォルダーを指します。したがって、~/desktopはユーザーのデスクトップフォルダです。

14
Saqib

Windowsの国際バージョンでは機能しないだけでなく、ユーザーがレジストリを編集してデスクトップフォルダーを別の場所に置くと失敗します。 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%
6
Dave Webb

dOSコマンドプロンプトを開いてsetコマンドを実行することもできます。

これにより、システムで使用可能な環境変数がわかります。

例えば。 -あなたが英語以外のWindowsを具体的に要求しているので-ここに私自身の例がありますGerman Edition(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ファミリー15モデル67 Steppi ng 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 
 
4
anon

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%
3
Osama Rajab

これは少し古い記事であることに気づきましたが、これは同様の状況の人々に役立つかもしれないと思いました。簡単な1行の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>"

上記のコードでは、「デスクトップ」を有効な特別なフォルダー(お気に入り、スタートメニューなど)に置き換えることができます-完全な公式リストは https://msdn.Microsoft.com/en-us/library/0ea7b5xeにあります%28v = vs.84%29.aspx )そしてもちろん<file_to_copy>をそこに配置したい実際のファイルとともに。これにより、レジストリにアクセスしようとするのを防ぐことができます(制限されたユーザーとしては実行できません)。また、複数のアプリケーションに適応するのに十分なほど単純でなければなりません。

ああ、知らない人にとっては、"%~dp0"はスクリプトの呼び出し元のディレクトリにすぎません。 UNCパスでも機能するため、バッチファイルは非常に移植性が高くなります。それは特に末尾の「\」で終わるため、一見すると少し奇妙に見えるかもしれません。

2
Improv

これは解決策ではありませんが、役立つことを願っています: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%が含まれている場合、コピーコマンド中に変換されません。

2
fupsduck

同様の問題があり(VBScriptまたはPowerShellはオプションではありませんでした)、この記事で見つけたコードはうまくいきませんでした。 OSバージョンと言語バージョンに問題がありました。いくつかの実験の後、私はこのソリューションに来ました:

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
MBu

このコードを使用して、レジストリからユーザーデスクトップおよびパブリックデスクトップパスを取得し、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

最後の2行の「」内にはTABが含まれています。一部のテキストエディターでは、TABを押すとスペースが追加されるため、スペースではなく実際のTABを使用してください。

コードにsetlocal enabledelayedexpansionが必要かどうかわかりません。これは、CPUアーキテクチャ、アカウント言語、Windowsバージョンとサービスパック、ユーザー/パブリックデスクトップへのパスなどの一般的な変数を設定するために他のバッチから呼び出すSETVARS.CMDの一部です.

1
Johnye

@Dave Webbの答えはおそらく道のりです。私が考えることができる他の唯一のものは CSIDLs です:

CSIDL_DESKTOPDIRECTORY

デスクトップにファイルオブジェクトを物理的に格納するために使用されるファイルシステムディレクトリ(デスクトップフォルダー自体と混同しないでください)。一般的なパスはC:\ Documents and Settings\username\Desktopです。

ただし、コマンドラインからこれらを取得する方法はわかりません。

1
Pekka 웃

これは、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%フォルダーにコピーする必要があります。

1
tomasz86

多言語バージョン、日本語OSでテスト済み
バッチファイル

 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 =
デスクトップの設定=
1
Josh

これは古いトピックの一種ですが、Powershell変数を使用します

$env:UserProfile 

それを使用してデスクトップにアクセスするには、次のようになります。

cd $env:UserProfile\desktop

これはWindows 7でローカルとリモートの両方で機能します。クライアントマシンが$ homeに値を持たない状況に出くわしたときに、これが役立つことを願っています。

0
Gearhead351