Microsoft PowerToys版本
0.72.0
安装方法
WinGet
以管理员身份运行
是的
存在问题的区域?
PowerToys Run
重现问题的步骤
cd "%APPDATA%\Microsoft\Windows\Start Menu\"
mklink /D SomeDirWithExeOrLnk ..\..\..\..\..\OneDrive\SomeDirWithExeOrLnk\
mklink /J OtherDirWithExeOrLnk %OneDriveConsumer%\OtherDirWithExeOrLnk
启动PT Run并尝试运行例如位于符号链接目录中的exe文件。
预期行为
允许使用符号链接。
diff --git a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
index 9f22fd0..64c1d04 100644
--- a/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
+++ b/src/modules/launcher/Plugins/Microsoft.Plugin.Program/Programs/Win32Program.cs
@@ -736,11 +736,23 @@ namespace Microsoft.Plugin.Program.Programs
{
// https://learn.microsoft.com/dotnet/api/system.io.enumerationoptions?view=net-6.0
// Exclude directories with the Reparse Point file attribute, to avoid loops due to symbolic links / directory junction / mount points.
- AttributesToSkip = FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReparsePoint,
+ AttributesToSkip = FileAttributes.Hidden | FileAttributes.System, // | FileAttributes.ReparsePoint,
RecurseSubdirectories = false,
}))
{
- folderQueue.Enqueue(childDirectory);
+ var attrs = File.GetAttributes(childDirectory);
+ if (attrs.HasFlag(FileAttributes.ReparsePoint))
+ {
+ var fsi = System.IO.Directory.ResolveLinkTarget(childDirectory, true);
+ if (fsi is DirectoryInfo di)
+ {
+ folderQueue.Enqueue(di.FullName);
+ }
+ }
+ else
+ {
+ folderQueue.Enqueue(directory);
+ }
}
}
catch (Exception e) when (e is SecurityException || e is UnauthorizedAccessException)
实际行为
在查找程序时,忽略符号链接。
Win32Program.cs#L739
2条答案
按热度按时间njthzxwz1#
我们故意添加了那行代码,是因为人们存在递归循环,导致无限查询。
j91ykkif2#
我已经阅读了评论行,但在将路径添加到列表之前解决符号链接的问题,这是否可以解决这个问题?
这是我唯一可以添加一些自定义路径的方法,该路径会递归扫描。