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はオンです。
バッチファイルと共に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、
ユリアン・セルバノイウ
安全のために、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
[Environment]::GetFolderPath("Desktop")
を使用するというKBの答えは、明らかにこれを行うための公式のWindows APIです。
ただし、プロンプトでインタラクティブに作業している場合、または単にマシン上で動作するものが必要な場合は、チルダ(〜)文字は現在のユーザーのホームフォルダーを指します。したがって、~/desktop
はユーザーのデスクトップフォルダです。
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%
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
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%
これは少し古い記事であることに気づきましたが、これは同様の状況の人々に役立つかもしれないと思いました。簡単な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パスでも機能するため、バッチファイルは非常に移植性が高くなります。それは特に末尾の「\」で終わるため、一見すると少し奇妙に見えるかもしれません。
これは解決策ではありませんが、役立つことを願っています: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%が含まれている場合、コピーコマンド中に変換されません。
同様の問題があり(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サブルーチンは、環境変数の遅延展開を可能にします。
このコードを使用して、レジストリからユーザーデスクトップおよびパブリックデスクトップパスを取得し、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の一部です.
@Dave Webbの答えはおそらく道のりです。私が考えることができる他の唯一のものは CSIDLs です:
CSIDL_DESKTOPDIRECTORY
デスクトップにファイルオブジェクトを物理的に格納するために使用されるファイルシステムディレクトリ(デスクトップフォルダー自体と混同しないでください)。一般的なパスはC:\ Documents and Settings\username\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%フォルダーにコピーする必要があります。
多言語バージョン、日本語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 =
デスクトップの設定=
これは古いトピックの一種ですが、Powershell変数を使用します
$env:UserProfile
それを使用してデスクトップにアクセスするには、次のようになります。
cd $env:UserProfile\desktop
これはWindows 7でローカルとリモートの両方で機能します。クライアントマシンが$ homeに値を持たない状況に出くわしたときに、これが役立つことを願っています。