web-dev-qa-db-ja.com

ジャンクションを使用して再帰せずにすべてのファイルとディレクトリを一覧表示します

native | portalツールでnicodeまたはsystem local-compatibleパスの下のすべてのファイルとディレクトリのリストを取得できますか- 再帰的にWindowsではジャンクションポイントまたはリンクに再帰せずに?

たとえば、組み込みのdirtakedownicaclsコマンドは、Application Dataディレクトリ( )で無限ループに陥ります。 1 )。

[〜#〜] edit [〜#〜]テキストファイルまたは少なくとも簡単なクリップボード転送を出力として取得できるようにしたい。

4
n611x007

これはどういうわけか難しい質問でした。 StackOverflowでさえ ファンシーソリューション しかありません。
しかし、これは、junctionフォルダーループなしですべてのファイルを再帰的にリストするための単純なものです。

PowerShellを使用して、属性「ReparsePoint」が含まれているかどうかを各ファイルでテストします

function Recurse($path) {

  $fc = new-object -com scripting.filesystemobject
  $folder = $fc.getfolder($path)

  foreach ($i in $folder.files) { $i | select Path }

  foreach ($i in $folder.subfolders) {
    $i | select Path        
    if ( (get-item $i.path).Attributes.ToString().Contains("ReparsePoint") -eq $false) {        
        Recurse($i.path)
    }
  }
}

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$outputlist = Recurse($scriptPath) | Out-File -Filepath .\outputlist.txt 
  1. コードをテキストファイルに貼り付けて、PowerShell(.ps1)スクリプトとして保存します
  2. スクリプトを目的のフォルダー内に配置して、すべてのファイルとフォルダーを再帰的に一覧表示します
  3. PowerShellを使用してスクリプトを実行します。同じ場所にoutputlist.txtという名前の新しいファイルが表示されます

Powershellスクリプトと一般的なバッチコマンドの簡単な比較

powershell  - good, no indefinite loops

enter image description here

batch "DIR /B /S" - bad, indefinite loops through junctions points

enter image description here

6
nixda

1.小さなスクリプトを使用して、すべてがリストされるようにしますが、ジャンクションは追跡されません。

この回答の以下のオプションとは異なり、Windows 7では正常に動作します

それをdnj.cmdと呼びましょう(Dir No Junctionsのように)

@(ECHO OFF
    SETLOCAL ENABLEEXTENSIONS
    CHCP 65001>NUL
    IF "%~1"=="" (CALL :listDir .) ELSE CALL :listDir %*
    EXIT /B
)
:listDir <path>
FOR /F "usebackq delims=" %%F IN (`DIR /B /A "%~1"`) DO ECHO %~1\%%~F
(
    IF EXIST "%~1\*.*" FOR /F "usebackq delims=" %%F IN (`DIR /B /AD-L "%~1"`) DO CALL :listDir "%~1\%%~F"
    IF "%~2"=="" EXIT /B
    SHIFT
    GOTO :listDir
)

最初のFOR/DIRは出力用、2番目のFOR/DIRは再帰用です。このようにして、出力パラメーター(具体的には、DIRおよびECHO引数)を調整することもできます。たとえば、ディレクトリなしで出力にファイルのフラットリストのみが必要な場合は、次を使用します。

FOR /F "usebackq delims=" %%F IN (`DIR %1 /B /A-D`) DO ECHO %%~F

最初のFORの代わりに。

呼び出し:dnj.cmdpath [path [...]]

出力リダイレクトは、従来のDIRと同じように機能するため、

cmd /C "dnj.cmd "%USERPROFILE%" | CLIP"

win + R(「実行」)プロンプトから動作します。

2. Windows 10を使用している場合は、DIR/S/A-Lを使用します

このように、ジャンクションはリストされません。また、/ Sで繰り返されることもありません。 Windows 7では、DIR/S/AD-Lはジャンクションを再帰的に実行します。8/ 8.1についてはわかりません。

テキストファイルへの出力を含むバッチ:

CHCP 65001 & REM for UTF-8
DIR %* /B /S /A-L > out.txt

(パスと追加のDIR引数をバッチ引数として渡す)

クリップボードへのcmd.exe(Win + R経由で呼び出すことができます):

cmd /C "CHCP 65001 & DIR "%USERPROFILE%" /B /S /A-L | CLIP"

クリップボードはデフォルトでUnicodeですが、事前にCHCPがないと、DIR出力はOEMコードページにあるため、一部の文字が失われる可能性があります。/Cの後の引用符は、%USERPROFILE%の周りの内部引用符で奇妙に見えますが、CMD構文では必要です。

2
LogicDaemon

PowerShellをより簡潔に使用する:

$items = @(pwd);
while($items){ $newitems = $items | Get-ChildItem | Where-Object -Property Attributes -NotLike *ReparsePoint*; $newitems; $items = $newitems | Where-Object -Property Attributes -Like *Directory* }

これをすべてテキストファイルにするには、全体をかっこで囲み、パイプで出力ファイルに入れます。

( $items = @(pwd); while($items){ $newitems = $items | gci | where -Property Attributes -NotLike *ReparsePoint*; $newitems; $items = $newitems | where -Property Attributes -Like *Directory* } ) | out-file myfile.txt
2
kb0

ここでの問題は、誰かがApplicationDataフォルダーから再帰防止を削除したことです。

フォルダの一覧表示/データの読み取りを行うには、全員に拒否する必要があります。

そこに行きたい場合は、それが指すAppDataフォルダーを使用してください。

2つのジャンクションポイントがあります。1つは%userprofile%にあり、もう1つは%userprofile%\localにあります。

1
trigger

元のシンボリックリンクfor Application Dataには、Everyoneがターゲットフォルダのコンテンツを読み取ったり表示したりするのを防ぐための特別な権限と属性があります(シンボリックリンクを介して)。これにより、プログラムがキャッチされるのを防ぎます。再帰ループで。パーミッションと属性を簡単に再適用できます。ただし、非常に注意してくださいこれらのパーミッションと属性をシンボリックリンクにのみ適用し、実際のファイルやフォルダーには適用しないようにします。 シンボリックリンクWindows Explorerのアイコンになり、フォルダアイコンの上にショートカット矢印が表示されます。

  1. 開くWindowsエクスプローラー
  2. altキーをタップし、ツール、次にオプション)、次に表示タブ)をクリックします。
  3. [ ] Hide protected operating system filesのオプションを無効にし、(x) Show hidden files, folders, or drivesのオプションを有効にします。
  4. C:\Users\[user]\AppData\Localに移動します
  5. Application Dataシンボリックリンクを右クリックし、プロパティ実際のフォルダではなくシンボリックリンクであることを確認してください-フォルダアイコンの上にオーバーレイとしてショートカット矢印が必要です)を選択します。
  6. セキュリティタブ、次に詳細、次に権限の変更)]をクリックします。
  7. Everyoneを追加し、Everyoneの権限を次のように設定します:
    • 適用先= このフォルダのみ<-これは重要です
    • 権限=拒否フォルダの一覧表示/データの読み取り<-これは再帰を停止します
  8. [〜#〜] ok [〜#〜]をクリックし、次にYes]をクリックして、許可ルールの前に拒否ルールが適用される)という警告を表示します。
  9. [〜#〜] ok [〜#〜]をもう一度クリックして、変更を適用します
  10. 所有者タブ)をクリックし、編集)をクリックしてから、他のユーザーまたはグループ)をクリックします。
  11. SYSTEMと入力し、Windows Explorerに戻るまで[〜#〜] ok [〜#〜]]をクリックし続けます

再帰が無効になりました。あなたがしたいと思うかもしれないもう一つのことがあります。これらのタイプのシンボリックリンクのほとんどは、ユーザーに表示されないように特別なファイル属性を持っています。コマンドプロンプトを開き、次のコマンドを実行します。

cd "%userprofile%\AppData\Local"
attrib +S +H +I /L "Application Data"

/Lオプションは、attrib+S +H +Iをターゲットフォルダー(C:\Users\[user]\AppData\Local)に適用する代わりに、シンボリックリンク)に適用するように指示します。

混乱した場合は、シンボリックリンクを簡単に削除してコマンドプロンプト)から再作成できます。以前と同じフォルダを指すように再作成するように注意してください。dir /aコマンドはApplication Dataが指す場所を示します。mklinkコマンドの最後のパラメーターとしてターゲットフォルダーを逐語的に再入力する必要があります。

cd "%userprofile%\AppData\Local"
attrib -H -S -I /L "Application Data"
dir /a
rd "Application Data"
mklink /J "%userprofile%\AppData\Local\Application Data" "%userprofile%\AppData\Local"

これで、再帰の問題があるApplication Dataシンボリックリンクができました。したがって、上記の手順に従って、再帰の問題を修正してください。

手順3の設定を元の値に戻すことを忘れないでください。そうすれば、非表示にする必要のあるファイルが引き続き表示されなくなります。

1
James L.

この問題は、アプリケーションデータフォルダーから再帰防止アクセス許可が削除されたことが原因である可能性があります(下位互換性のために作成されたWindows Vista +ジャンクションポイントに適用される場合があります)。

これらのジャンクションポイントには、List Folder/Read DataパーミッションのDENYto EVERYONEが必要です。これは、ALLOWパーミッションよりも優先され、ファイルシステムへのアクセス方法が原因でディレクトリ再帰プログラムによって回避されないことを願っています。

https://msdn.Microsoft.com/en-us/library/windows/desktop/bb968829(v = vs.85).aspx から、ジャンクションポイントはReparsePoint属性、およびHiddenおよびSystem属性。

次のPowershellコマンドは、以前のどの回答よりも、ディレクトリ再帰からジャンクションポイントを除外するためのより簡単な解決策と思われるものの基礎です。

get-childitem $RootDirectoryForRecusion -recurse -force | where-object {-not ($_.Attributes -match "ReparsePoint" -and $_.Attributes -match "Hidden" -and $_.Attributes -match "System")}

0
user66001

CMDプロンプトから:

dir/A:-L/S/B

編集:これは、それが存在するディレクトリ内の実際のジャンクションをリストしませんが、ジャンクションを再帰的に下っていきます。

0
wildotter

これはネイティブツールではないかもしれませんが、Windows 7を使用している人には役立つ可能性があります。 FileLocator Pro というプログラムがあり、[詳細/ジャンクションポイント]の下にジャンクションポイントの検索をオフにするオプションがあります。

それが完了したら、次のようにコマンドラインプログラムflpsearchを使用できます。

"C:\Program Files\Mythicsoft\FileLocator Pro\flpsearch.exe" -o c:\biglist.txt -d c:\;d:\;e:\ -ofbs -f *

Echo Started cleanup

for /F "tokens=1-2 delims=  " %%i in (c:\biglist.txt) do if "!prevx!" neq "%%i" (ECHO %%i >> c:\big.txt & (if /i "%%j" neq "on" echo        %%j >> c:\big.txt) & set prevx=%%i) else (if /i "%%j" neq "on" echo     %%j >> c:\big.txt) 

エコーとデリムの後に文字通りのタブがあるので、テキストエディタがタブをスペースに変換していないことを確認してください。

これがWin7ユーザーまたは2人のユーザーに役立つことを願っています。

多くの場合、PowerShellオプションも優れていますが、DOSバッチは別の話です。

0
colin lamarre

PowerShell 3.0には、新しいパラメーター属性があります。

ジャンクションフォルダのないディレクトリ構造を一覧表示します:

Get-ChildItem -Path $RootDirectory -Attributes !ReparsePoint -Recurse -Force -ErrorAction SilentlyContinue

ディレクトリ構造からのみjunctionフォルダを一覧表示します:

Get-ChildItem -Path $RootDirectory -Attributes ReparsePoint -Recurse -Force -ErrorAction SilentlyContinue

詳細: PowerShell 3.0を使用して高度な属性に基づいてファイルをフィルタリングする

0
mazarin

PowerShellでは、

Get-ChildItem /Recurse <path> |
Where-Object { $_.Mode -notlike 'd*l' } |
ForEach-Object { $_.FullName};

保存したい場合は、出力をファイルにパイプするだけです。

0
hwiechers