XPおよびVistaでバッチスクリプトからユーザーのDocumentsフォルダーを見つける最良の方法は何ですか?%USERPROFILE%\ Documentsであると想定しても安全ですか?
環境変数の完全なリファレンスは、ここの Microsoftサイト にあります。レジストリキーにもあります。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
String value: Personal
マイドキュメントフォルダが標準の場所にない場合は、レジストリキーから情報を引き出すのがおそらく最も信頼できる方法です。
したがって、私の最終バージョンは次のようになります。
FOR/F "tokens = 3 delims =" %% G IN( 'REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"/v "Personal"')DO(SET docsdir = %% G)
ここで、delims =とそれに続く "の間の文字は単一のタブです。エディターがスペースではなくタブを出力することを確認してください。
編集:Windows 7(およびおそらくすべてのウィンドウ)では、デフォルトでタブだけでなくトークン間に使用される空白であるdelims =を指定しないでください。
マイドキュメントの場所を特定する最良の方法は、Windowsレジストリからです。
このページの他のいくつかの回答とコメントは、「regquery」の使用に言及しています。以下は、パス内のスペースとさまざまなバージョンのWindowsを考慮した正しい実装です。
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do (
set RNAME=%%A
set RTYPE=%%B
set RDATA=%%C
)
スクリプトライター向けのワンライナーは次のとおりです。
for /f "tokens=1,2*" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do set MY_DOCS_ROOT=%%C
これはローカリゼーションまたは国際化を考慮していません。これは、英語以外のバージョンのWindowsではテストされていません。そのトピックに関するコメントは大歓迎です。
このはWindows XP、Windows Vista、Windows 7、およびWindows 8で機能します。
注:tokens =オプションでアスタリスクを使用することは、通常マイドキュメントのパスにスペースが含まれているWindowsXPにとって重要です。
注:%% Bや%% Cなどの暗黙的な変数の使用が少し奇妙に思える場合は、次の記事をご覧ください。
tokens = 3 *は、3番目のトークンと4番目+以降のすべてのアイテムを処理します。これは、tokens = 3、*と書くこともできます。
指定された各トークンにより、対応するパラメータ文字が割り当てられます。トークンに使用される文字は大文字と小文字が区別されます。
Tokens =文字列の最後の文字がアスタリスクの場合、その行の残りのすべてのテキストに追加のパラメーターが割り当てられます。
最初の変数はFORステートメントで宣言され、後続の変数はtokens =オプションを介して暗黙的に宣言されます。
リンクされた記事は、暗黙的に宣言される変数の正確な順序を示していますが、基本的にアルファベット順です。
(3つのトークンを使用して、FORステートメントで%% Aを宣言すると、%% Bと%% Cが暗黙的に宣言されます。同様に、FORステートメントで%% Xを宣言すると、% %Yと%% Zは暗黙的に宣言されます。)
英語のウィンドウでは「マイドキュメント」などのみです。別の言語を使用している場合、パス名は「翻訳」されます(Vistaを除く)
私のように、バッチファイルの経験がほとんどないユーザーのドキュメントフォルダを簡単に取得する方法を探しているときにこの投稿に出くわしたが、Werkkrewまたは(おそらく?)派生バージョンの優れたソリューションを使用したいすべての人にとってuser55644によって、それが私のWindows 7PCで動作するようにした方法です。
echo off
setlocal enableextensions enabledelayedexpansion
FOR /F "tokens=3" %%G IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') DO (SET targetdir=%%G)
echo on
echo %targetdir%
これはシステムが認識している場所です(ただし、XPのマイドキュメントです)が、それが環境にとって安全な前提であるかどうかを自分で判断する必要があります。ただし、マイドキュメントリダイレクトを使用する場合は、その変数をリダイレクト先の変数に設定し、デフォルトをc:\ documents and settings [username] in XP or c:\ users [ユーザー名] Vistaで。
xpにとって安全ではありません。マイドキュメントがあり、ローカライズ可能です。
Windows XPは「マイドキュメント」と名付け、Vistaは「ドキュメント」と名付けます。スクリプトを挿入して、実行しているOSを判別できます。
@echo off
IF EXIST "%USERPROFILE%\My Documents" (
echo Windows XP
) ELSE (
echo Vista
)
Windows Vistaでは、
%USERPROFILE%\Documents
しかし、Windows XPでは、
%USERPROFILE%\My Documents
これが、2つの異なるオペレーティングシステムの唯一の違いです。
また、Windows Vistaでは、Videos
、Music
、およびPhotos
ディレクトリはすべてC:\Users\[%USERNAME]
の下にあることを忘れないでください。
:getuserdoc folder from registry
set idkey="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
call:fetchvalue errorlevelvariable %idkey% Personal
goto:eof
errorlevel is set if fail
:fetchvalue
set /a %1=0
REG query %2 /v %3
if ERRORLEVEL 1 (set /a %1=1&goto :eof)
FOR /F "tokens=3* skip=2 delims= " %%A IN ('REG QUERY %2 /v %3') DO SET %3="%%A"
goto:eof
このウェブページは回答文字を表示できないため、ボタンGETSourceを使用してください。削除されました。