有没有原生|便携可以给我一个统一码或系统本地兼容路径下所有文件和目录的列表递归地,无需递归到连接点或链接,在 Windows 中?
例如,内置dir
takedown
icacls
命令会陷入无限循环,应用数据目录 (1)。
编辑我希望能够获得一个文本文件或至少一个简单的剪贴板传输作为输出。
答案1
这是一个很难的问题。即使是 StackOverflow 也只有奇特的解决方案。
但这里有一个简单的方法,用于递归列出所有文件,而没有连接文件夹循环。
使用 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
- 将代码粘贴到文本文件中并将其保存为 PowerShell (.ps1) 脚本
- 将脚本放在所需文件夹中,以递归方式列出所有文件+文件夹
- 使用 PowerShell 执行脚本。
outputlist.txt
将出现一个在同一位置调用的新文件
Powershell 脚本与常见批处理命令的快速比较
powershell - good, no indefinite loops
batch "DIR /B /S" - bad, indefinite loops through junctions points
答案2
原本的符号链接具有Application Data
特殊权限和属性,以防止Everyone
读取或查看目标文件夹的内容(通过符号链接)。这可以防止程序陷入递归循环。您可以轻松重新应用权限和属性,但要非常小心仅将这些权限和属性应用于符号链接而不是任何实际的文件或文件夹。符号链接将成为Windows资源管理器文件夹图标顶部有一个快捷箭头。
- 打开Windows资源管理器
- 点击
alt
按键,然后点击工具, 然后选项,然后点击看法标签 - 禁用选项
[ ] Hide protected operating system files
,并启用选项(x) Show hidden files, folders, or drives
。 - 导航
C:\Users\[user]\AppData\Local
- 右键单击
Application Data
符号链接并选择特性(确保它是符号链接而不是真正的文件夹——它应该有一个快捷方式箭头作为文件夹图标上的覆盖) - 点击安全标签,然后先进的, 然后更改权限
- 添加
Everyone
,并设置 的权限为Everyone
:- 申请至 =仅限此文件夹(<-这很重要)
- 权限 = 拒绝列出文件夹/读取数据(<- 这将停止递归)
- 点击好的然后点击是的警告称否定规则适用于允许规则
- 点击好的再次应用更改
- 点击所有者选项卡,点击编辑,然后点击其他用户或组
- 输入
SYSTEM
,然后继续点击好的直到你回到Windows资源管理器
递归现已禁用。还有一件事你可能想做。大多数这些类型的符号链接具有特殊文件属性,因此用户看不到它们。打开命令提示符并运行以下命令:
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中的设置改回其原始值,这样您就不会继续看到应该隐藏的文件。
答案3
1. 如果你使用的是 Windows 10,请使用 DIR /S /AL
这样,连接点就不会被列出,也不会通过 /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 代码页,因此可能会丢失一些字符。CMD 语法要求 /C 后面有引号,尽管 周围有内引号看起来很奇怪%USERPROFILE%
。
2. 使用小脚本,这样会列出所有内容,但不会跟踪连接点。
在 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 用于输出,第二个 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(“运行”)提示运行。
答案4
这可能不是一个原生工具,但对于使用 Windows 7 的人来说可能有用,有一个名为文件定位器专业版在“高级/连接点”下有一个选项可以关闭搜索连接点。
完成后,您可以使用命令行程序 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 用户有用。
当然,powershell 选项也不错,但 DOS 批处理则是另一回事。