native | portalツールでnicodeまたはsystem local-compatibleパスの下のすべてのファイルとディレクトリのリストを取得できますか- 再帰的に、Windowsではジャンクションポイントまたはリンクに再帰せずに?
たとえば、組み込みのdir
takedown
icacls
コマンドは、Application Dataディレクトリ( )で無限ループに陥ります。 1 )。
[〜#〜] edit [〜#〜]テキストファイルまたは少なくとも簡単なクリップボード転送を出力として取得できるようにしたい。
これはどういうわけか難しい質問でした。 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
outputlist.txt
という名前の新しいファイルが表示されますpowershell - good, no indefinite loops
batch "DIR /B /S" - bad, indefinite loops through junctions points
この回答の以下のオプションとは異なり、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.cmd
path [path [...]]
出力リダイレクトは、従来のDIRと同じように機能するため、
cmd /C "dnj.cmd "%USERPROFILE%" | CLIP"
win + R(「実行」)プロンプトから動作します。
このように、ジャンクションはリストされません。また、/ 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 /C "CHCP 65001 & DIR "%USERPROFILE%" /B /S /A-L | CLIP"
クリップボードはデフォルトでUnicodeですが、事前にCHCPがないと、DIR出力はOEMコードページにあるため、一部の文字が失われる可能性があります。/Cの後の引用符は、%USERPROFILE%
の周りの内部引用符で奇妙に見えますが、CMD構文では必要です。
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
ここでの問題は、誰かがApplicationDataフォルダーから再帰防止を削除したことです。
フォルダの一覧表示/データの読み取りを行うには、全員に拒否する必要があります。
そこに行きたい場合は、それが指すAppDataフォルダーを使用してください。
2つのジャンクションポイントがあります。1つは%userprofile%
にあり、もう1つは%userprofile%\local
にあります。
元のシンボリックリンクfor Application Data
には、Everyone
がターゲットフォルダのコンテンツを読み取ったり表示したりするのを防ぐための特別な権限と属性があります(シンボリックリンクを介して)。これにより、プログラムがキャッチされるのを防ぎます。再帰ループで。パーミッションと属性を簡単に再適用できます。ただし、非常に注意してくださいこれらのパーミッションと属性をシンボリックリンクにのみ適用し、実際のファイルやフォルダーには適用しないようにします。 シンボリックリンクはWindows Explorerのアイコンになり、フォルダアイコンの上にショートカット矢印が表示されます。
alt
キーをタップし、ツール、次にオプション)、次に表示タブ)をクリックします。[ ] Hide protected operating system files
のオプションを無効にし、(x) Show hidden files, folders, or drives
のオプションを有効にします。C:\Users\[user]\AppData\Local
に移動しますApplication Data
シンボリックリンクを右クリックし、プロパティ(実際のフォルダではなくシンボリックリンクであることを確認してください-フォルダアイコンの上にオーバーレイとしてショートカット矢印が必要です)を選択します。Everyone
を追加し、Everyone
の権限を次のように設定します: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の設定を元の値に戻すことを忘れないでください。そうすれば、非表示にする必要のあるファイルが引き続き表示されなくなります。
この問題は、アプリケーションデータフォルダーから再帰防止アクセス許可が削除されたことが原因である可能性があります(下位互換性のために作成された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")}
CMDプロンプトから:
dir/A:-L/S/B
編集:これは、それが存在するディレクトリ内の実際のジャンクションをリストしませんが、ジャンクションを再帰的に下っていきます。
これはネイティブツールではないかもしれませんが、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バッチは別の話です。
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では、
Get-ChildItem /Recurse <path> |
Where-Object { $_.Mode -notlike 'd*l' } |
ForEach-Object { $_.FullName};
保存したい場合は、出力をファイルにパイプするだけです。