web-dev-qa-db-ja.com

Documents Directory用のシステム定義の環境変数はありますか?

私は%USERPROFILE% Windows上のシステム定義環境変数XP(およびVistaおよびWindows 7)。「マイドキュメント」ディレクトリの場所を指すシステム定義環境変数はありますか?On XPデフォルトでは%USERPROFILE%\My DocumentsおよびWin 7では%USERPROFILE%\Documents。回避できる場合は、PowershellスクリプトでOSバージョンをテストする必要がないようにしたかっただけです。

57

デフォルトのインストールXPシステムには、そのための環境変数はありません。コマンドラインで「set」コマンド(パラメーターなし)を使用すると、すべての変数をリストできます。したがって、おそらくテストを行う必要があります。

OSバージョンをテストしたくない場合は、「ドキュメント」が存在するかどうかを確認し、存在しない場合は「マイドキュメント」を試すか、その逆を行います。ただし、s/oはXPマシンに「Documents」フォルダーを持つことができるため、これは完全ではありません。

ところで:私のシステムはドイツ語なので、フォルダは "Dokumente"と呼ばれます。それを考慮する必要があるかもしれません。

そのフォルダへのパスはに保存されます

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

Personalの下。ただし、レジストリへのアクセスが必要です。

ソース: Microsoft

30
msteiger

PowerShellの場合、次のように機能します。

_[environment]::getfolderpath("mydocuments")
_

魔法の糸を避ける

_[Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments)
_

.NETの場合、以下が当てはまります(つまり、all Windowsアプリケーションには適用されません)。

1つの答えが指摘しているように、マイドキュメントを指す環境変数はありませんが、.NETにはEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments)(C#)があります。

この質問を追加するのは、C#、環境変数、およびドキュメントをグーグルで検索するときにこの質問が出てきて、ジャスティンの答えにtheコード行が含まれていないからです:)

上記のコード行を使用することは、.NETのドキュメントにアクセスする好ましい方法です:)

C#で使用するために、この行をコピーして貼り付けます。

_var directoryNameOfMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
_

C#はMyDocumentsで大文字のDを必要とすることに注意してください。

31
flindeberg

組み込みの環境変数はありませんが、PowerShellでは次の方法で場所を見つけることができます。

[Environment]::GetFolderPath("mydocuments")

また、明らかに環境変数を作成できます:

$env:DOCUMENTS = [Environment]::GetFolderPath("mydocuments")
22
Hipponax43

(前の回答を繰り返しますが)「My Documents」ディレクトリには、すぐに使用できる環境変数(WinXP)はありません。

ただし、次のコマンドを使用して変数を設定できます。

Windows 7/8.1でテスト済み:

for /f "tokens=3* delims= " %a ^
in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') ^
do (set mydocuments=%a %b)

または(1ライナー)

for /f "tokens=3* delims= " %a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set mydocuments=%a %b)

すると、_%mydocuments%変数:

C:\>echo mydocuments="%mydocuments%"

mydocuments="C:\pathto\My Documents"

(XP/Vistaを使用している人はいますか?はいの場合、これをテストして、動作するかどうかをお知らせください。)

14
Nick Grealy

入力した場合:

set

コマンドプロンプトで、システムで定義されているすべての環境変数のリストを取得します。

私のもの(Windows 7 Home Premium)で定義されているものを見ると、どれもマイドキュメントを指しているようには見えません。

参考までに:

SHGetSpecialFolderPath 関数を使用して、マイドキュメントディレクトリへのパスを取得できます。または、 Environment.GetFolderPath メソッドを.Netで使用できます。

7
Justin
C:\Documents and Settings\mrabinovitch>set | grep -i document
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\myuser\Application Data
HOMEPATH=\Documents and Settings\myuser
USERPROFILE=C:\Documents and Settings\myuser

ご覧のとおり、そのような変数はありません。

5
Moisei

レジストリ。NET および PowerShell に基づく回答に加えて、 WshSpecialFolders を使用することもできます= from [〜#〜] wsh [〜#〜] 。以下に、自己完結型コマンド/バッチスクリプトを示します。

@echo off
call :script > "%temp%\%~n0.js" && cscript //nologo "%temp%\%~n0.js" %*
goto :EOF

:script
echo var specialFolders = WScript.CreateObject('WScript.Shell').SpecialFolders;
echo if (WScript.Arguments.length === 0) {
echo     for (var e = new Enumerator(specialFolders); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(e.item());
echo     }
echo } else {
echo     for (var e = new Enumerator(WScript.Arguments); !e.atEnd(); e.moveNext()) {
echo         WScript.Echo(specialFolders(e.item()));
echo     }
echo }
goto :EOF

JScriptでWSHスクリプトを発行し、それを使用して、引数として提供される特別なフォルダートークンの1つ以上のパスを取得します。上記のスクリプトをspecialf.cmdというファイルとして保存すると仮定すると、現在のユーザーのドキュメントディレクトリへのパスを取得するための使用法は次のようになります。

specialf MyDocuments

すべての特別なフォルダートークンをテストする別の使用法を次に示します。

specialf ^
  AllUsersDesktop ^
  AllUsersStartMenu ^
  AllUsersPrograms ^
  AllUsersStartup ^
  Desktop ^
  Favorites ^
  Fonts ^
  MyDocuments ^
  NetHood ^
  PrintHood ^
  Programs ^
  Recent ^
  SendTo ^
  StartMenu ^
  Startup ^
  Templates

これを使用して、次のような環境変数にキャプチャできます。

for /f "delims=/" %p in ('specialf MyDocuments') do @set MYDOCS=%p
4
Atif Aziz

混乱は、CSIDL/KNOWNFOLDERID値とコマンドシェル環境変数の可用性に起因する場合があります。

3
John Chacho

@NickGrealyの回答の改善:

  1. reg query出力
 empty_line 
 reg_key_path 
 name type value 
  1. レジストリ値の単語間に任意の量の「スペース文字」が存在する可能性があり、この場合、%a %b文字列は正しくありません

したがって、skip=2オプションを使用して最初の行をスキップし、tokens=2*オプションを使用してレジストリ値を%b変数に渡します。

for /f "skip=2 tokens=2*" %A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "UserDocs=%B"

またはスクリプトファイルの場合:

for /f "skip=2 tokens=2*" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do set "UserDocs=%%B"

ただし、レジストリ値[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\!Do not use this registry key]を考慮する

@AtifAzizの回答に基づく:

for /f "tokens=*" %A in ('echo WScript.Echo^(^(new ActiveXObject^("WScript.Shell"^)^).SpecialFolders^("MyDocuments"^)^)^>%TEMP%\getdoc.js ^& cscript /nologo %TEMP%\getdoc.js ^& del /q %TEMP%\getdoc.js') do @set "UserDocs=%A"
2
Dmitry Sokolov

(少なくとも)Windows 7のバッチファイルの場合、Nick Gのソリューションでは、ユーザー定義変数UserDocumentsを設定するための微調整が必​​要です。

FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set UserDocuments=%%a)

唯一の違いは、

  1. Delimsにはスペース文字を1つだけ使用します
  2. %aの代わりに%% a

行を表示せずに、結果を表示するには、次を使用します。

@FOR /F "tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @(Set UserDocuments=%%a)
@Echo ~~~~~~~~ UserDocuments=%UserDocuments%

ニックGに感謝します。あなたの答えは私に多くを教えてくれました。これが他の人の助けになることを願っています。

2
Rocky Scott

勝利XP、Vista、8、8.1、10でテストおよび動作中!!

@echo off
    for /f "skip=2 tokens=2*" %%c in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "docs=%%d" && echo WIN XP - 10
    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT

設計上、Windowsのドキュメント環境変数は存在しません。カスタマイズしたものを作成する必要があります。 here に移動してこれを行います。 MYDOCUMENTSという環境変数を定義して、参照する必要のある場所を参照します。それ以降は、%MYDOCUMENTS%で参照する環境変数になります。

1
Neal Bangia

windowsバッチファイル(.bat)またはWindowsコマンドスクリプト(.cmd)を更新する

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 SET DOCS=%USERPROFILE%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 FOR /f "tokens=3" %%x IN ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do (set docs=%%x) & echo WIN Vista - 10

    xcopy "C:\test.txt" "%docs%" /f /y
echo %docs%
pause
EXIT

以下は、Windowsを実行しているすべてのユーザーのユーザー変数の完全なリストです。

コードのregクエリ部分はその値を見つけて設定し、すぐに使用できるようにし、他のコードがすべてのユーザーに対して永続的に設定できるようにします。コードの広告レジストリ部分は、すべてのユーザーに対して有効にします。 setxにより、コードを使用するためにログオフしてログインし直す必要がなくなります。

現在のユーザー変数は、このコードをインストールした人にのみ適用されます。

@ECHO OFF
ECHO REG ALL USER variables

ECHO all user desktop
for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do @set "ALLDT=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDT" /t  "REG_SZ"  /d "%ALLDT%" /f
 setx ALLDT "%ALLDT%"

 Echo all user's documents
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Documents"') do @set "ALLDOC=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLDOC" /t  "REG_SZ"  /d "%ALLDOC%" /f
   setx ALLDOC "%ALLDOC%"

 echo all user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Programs"') do    @set "ALLSM=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSM" /t  "REG_SZ"  /d "%ALLSM%" /f 
 setx ALLSM "%ALLSM%"

  Echo all users startup
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Startup"') do @set "ALLSMSTU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLSMSTU" /t  "REG_SZ"  /d "%ALLSMSTU%" /f 
   setx ALLSMSTU "%ALLSMSTU%"

  Echo all users music
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonMusic"') do @set "ALLMU=%%d"
   REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLMU" /t  "REG_SZ"  /d "%ALLMU%" /f 
   setx ALLMU "%ALLMU%"

  echo all users pictures
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonPictures"') do @set "ALLPIC=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLPIC" /t  "REG_SZ"  /d "%ALLPIC%" /f 
 setx ALLPIC "%ALLPIC%"

 Echo all users videos
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "CommonVideo"') do @set "ALLVID=%%d"
 REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  /v "ALLVID" /t  "REG_SZ"  /d "%ALLVID%" /f
 setx ALLVID "%ALLVID%"

 Echo set cerrent user variables 

 Echo current users desktop
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"') do @set "myDesktop=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myDesktop" /t  "REG_SZ"  /d "%myDesktop%" /f 
setx myDesktop "%myDesktop%"

 Echo current users documents
 for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal"') do @set "mydoc=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "mydoc" /t  "REG_SZ"  /d "%mydoc%" /f 
   setx mydoc "%mydoc%"

 Echo current user start menu
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Start Menu"') do @set "myStart=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStart" /t  "REG_SZ"  /d "%myStart%" /f 
   setx myStart "%myStart%"

  Echo current user startup
  for /f "skip=2 tokens=2*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Startup"') do @set "myStartup=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myStartup" /t  "REG_SZ"  /d "%myStartup%" /f 
   setx myStartup "%myStartup%"

  Echo current users music
  for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Music"') do @set "myMU=%%d"
   REG ADD "HKEY_CURRENT_USER\Environment"  /v "myMU" /t  "REG_SZ"  /d "%myMU%" /f 
   setx myMU "%myMU%"

 Echo current users pictures
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Pictures"') do @set "myPIC=%%d"
  REG ADD "HKEY_CURRENT_USER\Environment"  /v "myPIC" /t  "REG_SZ"  /d "%myPIC%" /f 
  setx myPIC "%myPIC%"

 Echo current users video
 for /f "skip=2 tokens=3*" %%c in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "My Video"') do @set "myVID=%%d"
 REG ADD "HKEY_CURRENT_USER\Environment"  /v "myVID" /t  "REG_SZ"  /d    "%myVID%" /f
   setx myVID "%myVID%"

 exit
0
user9150112

Windowsバッチファイル(.bat)またはWindowsコマンドスクリプト(.cmd)

@echo off
ver | find "XP" > nul
    if %ERRORLEVEL% == 0 set Docs=%UserProfile%\My Documents & echo WIN XP
    if %ERRORLEVEL% == 1 set Docs=%UserProfile%\Documents & echo WIN Vista - 10

    xcopy  "C:\test.txt"  "%Docs%" /f /y 
pause
EXIT