web-dev-qa-db-ja.com

.batスクリプトでユーザーのドキュメントフォルダーを見つける

XPおよびVistaでバッチスクリプトからユーザーのDocumentsフォルダーを見つける最良の方法は何ですか?%USERPROFILE%\ Documentsであると想定しても安全ですか?

4
lajos

環境変数の完全なリファレンスは、ここの Microsoftサイト にあります。レジストリキーにもあります。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
String value: Personal

マイドキュメントフォルダが標準の場所にない場合は、レジストリキーから情報を引き出すのがおそらく最も信頼できる方法です。

7
WerkkreW

したがって、私の最終バージョンは次のようになります。

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 =を指定しないでください。

7
user55644

マイドキュメントの場所を特定する最良の方法は、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などの暗黙的な変数の使用が少し奇妙に思える場合は、次の記事をご覧ください。

http://ss64.com/nt/for_f.html

tokens = 3 *は、3番目のトークンと4番目+以降のすべてのアイテムを処理します。これは、tokens = 3、*と書くこともできます。

指定された各トークンにより、対応するパラメータ文字が割り当てられます。トークンに使用される文字は大文字と小文字が区別されます。

Tokens =文字列の最後の文字がアスタリスクの場合、その行の残りのすべてのテキストに追加のパラメーターが割り当てられます。

最初の変数はFORステートメントで宣言され、後続の変数はtokens =オプションを介して暗黙的に宣言されます。

リンクされた記事は、暗黙的に宣言される変数の正確な順序を示していますが、基本的にアルファベット順です。

(3つのトークンを使用して、FORステートメントで%% Aを宣言すると、%% Bと%% Cが暗黙的に宣言されます。同様に、FORステートメントで%% Xを宣言すると、% %Yと%% Zは暗黙的に宣言されます。)

1

英語のウィンドウでは「マイドキュメント」などのみです。別の言語を使用している場合、パス名は「翻訳」されます(Vistaを除く)

1
fsp

私のように、バッチファイルの経験がほとんどないユーザーのドキュメントフォルダを簡単に取得する方法を探しているときにこの投稿に出くわしたが、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%
0
aeglasin

これはシステムが認識している場所です(ただし、XPのマイドキュメントです)が、それが環境にとって安全な前提であるかどうかを自分で判断する必要があります。ただし、マイドキュメントリダイレクトを使用する場合は、その変数をリダイレクト先の変数に設定し、デフォルトをc:\ documents and settings [username] in XP or c:\ users [ユーザー名] Vistaで。

0
squillman

xpにとって安全ではありません。マイドキュメントがあり、ローカライズ可能です。

0
Alexander Taran

Windows XPは「マイドキュメント」と名付け、Vistaは「ドキュメント」と名付けます。スクリプトを挿入して、実行しているOSを判別できます。

@echo off
IF EXIST "%USERPROFILE%\My Documents" (
    echo Windows XP
) ELSE (
    echo Vista
)
0
Jack B Nimble

Windows Vistaでは、

%USERPROFILE%\Documents

しかし、Windows XPでは、

%USERPROFILE%\My Documents

これが、2つの異なるオペレーティングシステムの唯一の違いです。

また、Windows Vistaでは、VideosMusic、およびPhotosディレクトリはすべてC:\Users\[%USERNAME]の下にあることを忘れないでください。

0
JFV
: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を使用してください。削除されました。

0
dod destroyer