Windows BAT がスタート メニューのパスとデスクトップのパスを取得する


Bat バッチ処理では、 フォルダー/ファイル/ショートカットなどを 、 、 などに追加する必要がある場合があります。そのためには、 最初に 対応するパスを取得する必要があります 开始菜单 この記事では、batバッチ処理で 、、、 絶対パス を取得する方法をまとめます。 桌面 任务栏
开始菜单 桌面 任务栏

1. 解決策

解決策 1: 環境変数を通じて取得する

@echo off
:: 获取当前用户Desktop路径
set desk_path=%USERPROFILE%\Desktop
echo desk_path=%desk_path%

:: 获取当前用户Start Menu路径
set sm_path=%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu
::set sm_path=%APPDATA%\Microsoft\Windows\Start Menu
echo sm_path=%sm_path%

:: 获取当前用户TaskBar路径
set tb_path=%USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
::set tb_path=%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
echo tb_path=%tb_path%

:: 获取公共用户Desktop路径
set com_dp_path=%PUBLIC%\Desktop
::set com_dp_path=C:\Users\Public\Desktop
echo com_dp_path=%com_dp_path%

:: 获取公共用户Start Menu路径
set com_sm_path=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs
::set com_sm_path=%ProgramData%\Microsoft\Windows\Start Menu\Programs
::set com_sm_path=C:\ProgramData\Microsoft\Windows\Start Menu\Programs
echo com_sm_path=%com_sm_path%

:: 没有公共用户TaskBar这个概念

出力結果:

desk_path=C:\Users\cyinl\Desktop
sm_path=C:\Users\cyinl\AppData\Roaming\Microsoft\Windows\Start Menu
tb_path=C:\Users\cyinl\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
com_dp_path=C:\Users\Public\Desktop
com_sm_path=C:\ProgramData\Microsoft\Windows\Start Menu\Programs

解決策 2: 登録フォームから取得する

@echo off
:: 获取当前用户Desktop路径
::REG_SZ
set desk_rq=REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"
for /F "tokens=3,*" %%d in ('%desk_rq%') do set desk_path=%%d %%e
echo desk_path=%desk_path%
::REG_EXPAND_SZ
set desk_rq_ex=REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop"
for /F "tokens=3,*" %%d in ('%desk_rq_ex%') do set desk_path_ex=%%d %%e
echo desk_path_ex=%desk_path_ex%

:: 获取当前用户Start Menu路径
::REG_SZ
set sm_rq=REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Start Menu"
for /F "tokens=4,*" %%d in ('%sm_rq%') do set sm_path=%%d %%e
echo sm_path=%sm_path%
::REG_EXPAND_SZ
set sm_rq_ex=REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Start Menu"
for /F "tokens=4,*" %%d in ('%sm_rq_ex%') do set sm_path_ex=%%d %%e
echo sm_path_ex=%sm_path_ex%


:: 用户TaskBar路径,未注册到注册表


:: 获取公共用户Desktop路径
::REG_SZ
set com_desk_rq=REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"
for /F "tokens=4,*" %%d in ('%com_desk_rq%') do set com_desk_path=%%d %%e
echo com_desk_path=%com_desk_path%
::REG_EXPAND_SZ
set com_desk_rq_ex=REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop"
for /F "tokens=4,*" %%d in ('%com_desk_rq_ex%') do set com_desk_path_ex=%%d %%e
echo com_desk_path_ex=%com_desk_path_ex%

:: 获取公共用户Start Menu路径
::REG_SZ
set com_sm_rq=REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Start Menu"
for /F "tokens=5,*" %%d in ('%com_sm_rq%') do set com_sm_path=%%d %%e
echo com_sm_path=%com_sm_path%
::REG_EXPAND_SZ
set com_sm_rq_ex=REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Start Menu"
for /F "tokens=5,*" %%d in ('%com_sm_rq_ex%') do set com_sm_path_ex=%%d %%e
echo com_sm_path_ex=%com_sm_path_ex%

echo -----------------------------------------
::上述提取的路径,末尾都带有一个空格,(如果有必要)可以通过下述方法删除
set desk_path_ex=%desk_path_ex:~0,-1%
::将可扩展的路径,转为直接路径,以 desk_path_ex 为例
for /F "tokens=*" %%d in ('echo %desk_path_ex%') do set dpx_path=%%d
echo %desk_path_ex%=%dpx_path%

出力結果:

desk_path=C:\Users\cyinl\Desktop
desk_path_ex=%USERPROFILE%\Desktop
sm_path=C:\Users\cyinl\AppData\Roaming\Microsoft\Windows\Start Menu
sm_path_ex=%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu
com_desk_path=C:\Users\Public\Desktop
com_desk_path_ex=%PUBLIC%\Desktop
com_sm_path=C:\ProgramData\Microsoft\Windows\Start Menu
com_sm_path_ex=%ProgramData%\Microsoft\Windows\Start Menu
-----------------------------------------
%USERPROFILE%\Desktop=C:\Users\cyinl\Desktop

2. まとめ

  1. 桌面一般に、オプション 1 は要件を満たすことができますが、リダイレクトまたはリダイレクトするユーザーが非常に少ないなどの特殊なケースでは、开始菜单オプション 1 が実現できない可能性があります。このとき、オプション 2 が便利です。

  2. Registry ROOTKEY、現在のユーザーHKCU( ) に対応、パブリック ユーザー( )HKEY_CURRENT_USERに対応。HKLMHKEY_LOCAL_MACHINE

  3. レジストリ キーShell Foldersの下のパスはすべて直接パス (変数なし)、User Shell Folders項目の下のパスはすべて拡張パス (変数あり) です。

  4. キーコードの解釈:
    一般的な形式は次のとおりです。
    for /F "tokens=3,*" %%d in ('reg_query_command_str') do set path_value=%%d %%e
    1)"tokens=3,*"パート。クエリ対象の値の名前に n 個のスペースが含まれている場合は、3に置き換える必要があります3+n。たとえば、パブリック ユーザーのスタート メニューのパスを確認する場合、値の名前にはCommon Start Menu2 個のスペースが含まれており、その後"tokens=5,*";
    2) のpath_value=%%d %%e部分が含まれます。*抽出された部分 (すなわち) を結合する必要があります%%e。結合しない場合、スペースを含むパスに遭遇した場合、最初のスペース以降の部分が失われます。たとえば、パブリック ユーザーのスタート メニューのパスをクエリする場合、パスは です%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu。結合されていない場合%%e、取得されるパスは である%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Startため、問題が発生します。

  5. 補足:
    1) 抽出したパスの末尾のスペースを削除する必要がある場合は、次の方法を参照してください。
    set desk_path_ex=%desk_path_ex:~0,-1%
    2) 拡張パスを直接パスに変換する場合は、次の方法を参照してください。
    for /F "tokens=*" %%d in ('echo %desk_path_ex%') do set dpx_path=%%d

  6. タスク バーのパスはレジストリに登録されていないため、タスク バーのパスを取得する方法は解決策 1 のみです。

おすすめ

転載: blog.csdn.net/B11050729/article/details/131647723