Изменение значения столбца "Рейтинг" в проводнике для произвольных типов файлов

По сути, у меня есть большой набор различных носителей (текст, изображения, флэш-файлы, архивы, папки и т. Д.), И я пытаюсь организовать их.

В проводнике Windows есть столбец с оценкой, но, похоже, нет способа изменить рейтинг файлов, не открывая их в программном обеспечении для конкретного типа (например, медиаплеер или программа просмотра фотографий). Однако это не работает, когда файл имеет неподдерживаемый тип (.rar,.swf...) или каталог.

Я был бы более чем готов рассмотреть замену файлового менеджера (я уже рассмотрел довольно много, Directory Opus, Total Commander и т. Д.) Или даже решение, которое хранит метаданные рейтинга в скрытом файле. в каждой папке или отдельной базе данных. Единственное реальное критическое требование - это возможность сортировки по рейтингу и независимость от типов файлов.

В принципе, есть ли способ классифицировать большую коллекцию отсортированных файлов по рейтингу, которая будет работать с любым типом файлов, включая каталоги?

-

В идеале был бы простой способ добавить произвольные столбцы в проводник Windows и редактировать их напрямую. Тем не менее, кажется, нет никакого способа сделать это. Рейтинговая колонка - следующая лучшая вещь.


Что бы это ни стоило, на данный момент я более или менее разочаровался в поиске того, что может сделать то, что я ищу, как описано в вопросе. Сейчас я в основном использую специализированное python webapp для управления большим количеством моего медиа контента (это отличный способ научиться веб-программированию).

9 ответов

Я сделал действительно крошечную программу в AutoHotKey, которая делает то, что вы хотите.
Он отображает файлы и папки, и есть столбец рейтинга, который можно щелкнуть, чтобы установить оценку от 0 до 5. Он отображает "-", если файл еще не был оценен. Вы можете нажать на заголовки столбцов для сортировки. Дважды щелкните папку, чтобы перейти в нее, или файл, чтобы открыть ее.

Данные хранятся в INI-файле в том же каталоге, что и программа.

Вы можете скачать бинарный файл здесь: rater.exe ( зеркало)
И источник (на языке AutoHotKey): rater.ahk ( зеркало)

Столбец рейтинга в Windows показывает метаданные рейтинга, найденные в медиафайлах; Windows не поддерживает эти данные сама. Вы можете отредактировать его, щелкнув правой кнопкой мыши файл, выбрав "Свойства", а затем выбрав вкладку "Детали".

Скриншот,

В случае файлов, не относящихся к медиафайлам (rar, swf), метаданные оценки отсутствуют, поэтому у Windows нет возможности показать или отредактировать эту информацию, поэтому вам определенно потребуется другое программное обеспечение, чтобы сделать это за вас.

Вы можете использовать встроенные функции Проводника , чтобы добавить свойство к папкам (каталогам) файловой системы без использования стороннего программного обеспечения, посредством редактирования файла и реестра.

Для изменения записей HKLM, которые устанавливают сопоставление свойств ->, требуется разрешение администратора, но это однократная настройка для каждого компьютера. Для нормальной работы не требуется никаких специальных разрешений.

Соответствующий ключ реестра:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DesktopIniPropertyMap\PropertySetStorage

где подраздел{F29F85E0-4FF9-1068-AB91-08002B27B3D9}это FMTIDнабора свойств сводной информации COM и подраздела6указываетPropertyIDизSystem.Commentвнутри набора. Значение под этим ключом указывает соответствующую запись, определяющуюSection,Key(имя значения) иVarType. Итак.regфайл для связи с пользовательским файлом:

      Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DesktopIniPropertyMap\PropertySetStorage\{64440492-4C8B-11D1-8B70-080036B11A03}\9]
"Key"="Rating"
"Section"="Custom"
; 0x17 = 23 = VT_UINT
"VarType"=dword:00000017


Соответствующая запись в папкеdesktop.iniфайл будет:

      [Custom]
Rating=75

ОнSystem.Ratingдокументация дает целочисленный диапазон для каждого значения звезды:

и это все, что нужно для того, чтобы папки имелиRatingсвойство, которое можно отобразить в проводнике .

Но не очень практично создавать/редактировать файл Desktop.ini папки вручную каждый раз, когда вы хотите установить/изменить рейтинг папки. Но с помощью дополнительной магии реестра и сценария PowerShell вы можете создавать записи контекстного меню для автоматизации задачи.

Следующий код представляет собой универсальный сценарий для создания сопоставления свойств, записей контекстного меню, сценария времени выполнения и вспомогательных файлов.

Его должен запустить пользователь с правами администратора в консоли администратора PowerShell:

      ### Global Values ###

Clear-Host
echo @'
To install this script, even for a single user, you must have Admin permissions
and run this code in an Admin PowerShell window. This is due to the need to create
the property mapping entries under HKLM.

But the context menu entries and file location can be created for machine-wide
use or only for the user running this script.

Do you wish to install this script for all users or just the currently logged-in user?

'@
Do {} Until ((Read-Host 'A(ll users) or C(urrent user)') -match 'a|c')

$Drive = If ($Matches[0] -eq 'a') {'HKLM:'} ELse {'HKCU:'}

$Null  = Read-Host @'


If you're installing this script for all users, be sure to select a file location
where all users have at least read permissions, such as the folders uner
"C:\Users\Public".

:--- Press <Enter> to continue ---
'@

$BrowseRoot  = If ( $Drive -eq 'HKLM:' ) {"shell:Public"} Else {"shell:UsersFilesFolder"}
$ScriptFiles = (New-Object -com shell.application).BrowseForFolder(0,"Script files location",0x50,$BrowseRoot).Self.Path

echo ('Script files will be created in "{0}"...' -f $ScriptFiles)

### Registry entries creation ###

echo 'Creating registry entries...'

####### Property Mapping ###

$IniPropMap  = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DesktopIniPropertyMap\PropertySetStorage'
$RatingMap   = "$IniPropMap\{64440492-4C8B-11D1-8B70-080036B11A03}\9"

Set-ItemProperty (mkdir $RatingMap -Force).PSPath -InputObject ([PSCustomObject]@{
    'Key'     = 'Rating'
    'Section' = 'Custom'
    'VarType' = 0x17
})

####### Context menu entries ###

########### Set Rating ###

$TopKeys     = @( (Join-Path $Drive 'SOFTWARE\Classes\Directory\Background\Shell\RateFolder') ,
                  (Join-Path $Drive 'SOFTWARE\Classes\Directory\Shell\RateFolder') )
$Ratings     = @( 0 , 1 , 25 , 50 , 75 , 99 )

Set-ItemProperty (mkdir $TopKeys -Force).PSPath -InputObject ([PSCustomObject]@{
    'MUIVerb'         = 'Set Rating'
    'Position'        = 'Top'
    'SeparatorBefore' = ''
    'SubCommands'     = ''
})
Set-ItemProperty $TopKeys 'Icon' '%SystemRoot%\system32\imageres.dll,-1024' -Type ExpandString

0..5 | %{
    $splat = @{
        'Name'  = 'MuiVerb'
        'Value' = If ($_) {'★' * $_} Else {'(None)'}
        'Type'  = 'ExpandString'
    }
    Set-ItemProperty (mkdir (Join-Path $TopKeys "Shell\$_") -Force).PSPath @splat | out-null

    $splat = @{
        'Name'  = '(Default)'
        'Value' = ('"{0}\AddProp.bat" "{2}%V{2}" {1} Rating' -f $ScriptFiles , $Ratings[$_] , "'")
        'Type'  = 'String'
    }
    Set-ItemProperty (mkdir (Join-Path $TopKeys "Shell\$_\Command") -Force).PSPath @splat | out-null
}
########### Add Comment ###

$TopKeys     = @( (Join-Path $Drive 'SOFTWARE\Classes\Directory\Background\Shell\AddComment') ,
                  (Join-Path $Drive 'SOFTWARE\Classes\Directory\Shell\AddComment') )
Set-ItemProperty (mkdir $TopKeys -Force).PSPath -InputObject ([PSCustomObject]@{
    'MUIVerb'         = 'Add Comment'
    'Position'        = 'Top'
    'SeparatorAfter' = ''
})
$splat = @{
    'Name'  = '(Default)'
    'Value' = ('powershell.exe -NoProfile -Command "{0}\Set-FolderProps.ps1" "{1}%V{1}" Comment' -f $ScriptFiles , "'")
    'Type'  = 'String'
}
Set-ItemProperty (mkdir (Join-Path $TopKeys 'Command') -Force).PSPath @splat  



### Set-FolderProps.dll creation ###
###
###     Compiled Add-Type to access/wrap the APIs:
###       - ShowWindow() - https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showwindow
###       - WritePrivateProfileString() - https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-writeprivateprofilestringa
###       - SHGetSetFolderCustomSettings() - https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetsetfoldercustomsettings
###
###     Exposed Functions:
###       - [API]::ShowWindow(hWnd,nCmdShow)
###       - [Desktop.ini]::SetInfoTip(FolderPath,InfoTip)
###       - [Desktop.ini]::GetInfoTip(FolderPath)
###       - [Desktop.ini]::SetRating (FolderPath,Rating)

echo 'Creating "Set-FolderProps.dll"...'

Add-Type @'
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

public class API {

    public enum SW : int {
        Hide            = 0,
        Normal          = 1,
        ShowMinimized   = 2,
        Maximize        = 3,
        ShowNoActivate  = 4,
        Show            = 5,
        Minimize        = 6,
        ShowMinNoActive = 7,
        ShowNA          = 8,
        Restore         = 9,
        Showdefault     = 10,
        Forceminimize   = 11
    }
    [DllImport("user32.dll")]
    public static extern int ShowWindow(IntPtr hwnd, SW nCmdShow);
}


namespace Desktop {
    public class ini {

        [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool WritePrivateProfileString(
            [MarshalAs(UnmanagedType.LPWStr)] string lpAppName,
            [MarshalAs(UnmanagedType.LPWStr)] string lpKeyName,
            [MarshalAs(UnmanagedType.LPWStr)] string lpString,
            [MarshalAs(UnmanagedType.LPWStr)] string lpFileName );

        [DllImport("shell32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
        static extern int SHGetSetFolderCustomSettings(
            SHFolderCustomSettings           pSettings,
            [MarshalAs(UnmanagedType.LPWStr)]
            string                           pszPath,
            FCS                              dwReadWrite);

        [StructLayout(LayoutKind.Sequential)]
        public class SHFolderCustomSettings {
            public int    Size;
            public FCSM   Mask;
            public IntPtr pvid;
            public IntPtr pszWebViewTemplate;
            public int    cchWebViewTemplate;
            public IntPtr pszWebViewTemplateVersion;
            public IntPtr pInfoTip;
            public int    ccInfoTip;
            public IntPtr pclsid;
            public int    dwFlags;
            public IntPtr pszIconFile;
            public int    cchIconFile;
            public int    iIconIndex;
            public IntPtr pszLogo;
            public int    cchLogo;
        }


        public static int  SetInfoTip ( string FolderPath,
                                        string InfoTip      ) {

            SHFolderCustomSettings
                MySettings       = new SHFolderCustomSettings();

            MySettings.Size      = Marshal.SizeOf(MySettings);
            MySettings.Mask      = FCSM.INFOTIP;
            MySettings.pInfoTip  = Marshal.StringToHGlobalUni( InfoTip );
            MySettings.ccInfoTip = 0;

            int Result = SHGetSetFolderCustomSettings( MySettings,
                                                       FolderPath,
                                                       FCS.FORCEWRITE );
            Marshal.FreeHGlobal( MySettings.pInfoTip );
            return Result;
        }

        public static string  GetInfoTip ( string FolderPath ) {

            SHFolderCustomSettings
                MySettings       = new SHFolderCustomSettings();
            MySettings.Size      = Marshal.SizeOf(MySettings);
            MySettings.Mask      = FCSM.INFOTIP;
            MySettings.pInfoTip  = Marshal.AllocHGlobal(1024);
            MySettings.ccInfoTip = 1024 / 2 ;

            int Result = SHGetSetFolderCustomSettings( MySettings,
                                                       FolderPath,
                                                       FCS.READ );
            string InfoTip = "";
            if ( Result == 0 )
            {
                InfoTip = Marshal.PtrToStringUni( MySettings.pInfoTip );
            }
            else
            {
                InfoTip = "";
            }
            Marshal.FreeHGlobal( MySettings.pInfoTip );
            return InfoTip;
        }

        public static void SetRating ( string FolderPath,
                                       int    Rating      )
        {
            DirectoryInfo dir = new DirectoryInfo(FolderPath);
            AddItem ( FolderPath,
                      @"Custom",
                      @"Rating",
                      Rating.ToString() );
            dir.Attributes |= FileAttributes.ReadOnly;
        }

        public static bool AddItem ( string FolderPath,
                                     string Section,
                                     string KeyName,
                                     string Value       )
        {
            string   IniFilePath   = Path.Combine(FolderPath, @"desktop.ini");
         
            bool Return = WritePrivateProfileString( Section,
                                                     KeyName,
                                                     Value,
                                                     IniFilePath );
            File.SetAttributes( IniFilePath,
                                ( FileAttributes.Hidden |
                                  FileAttributes.System |
                                  FileAttributes.Archive  ));
            return Return;
        }
         
        public static int  SetNone ( string FolderPath ) {

            SHFolderCustomSettings
                MySettings       = new SHFolderCustomSettings();
            MySettings.Size      = Marshal.SizeOf(MySettings);
            MySettings.Mask      = FCSM.NONE;

            int Result = SHGetSetFolderCustomSettings( MySettings,
                                                       FolderPath,
                                                       FCS.FORCEWRITE );
            return Result;
        }

        private enum FCS : uint {
            READ            = 0x00000001,
            FORCEWRITE      = 0X00000002,
            WRITE           = 0X00000003,
        }

        [FlagsAttribute]
        public enum FCSM : uint {
            NONE            = 0x00000000,
            VIEWID          = 0x00000001,
            WEBVIEWTEMPLATE = 0x00000002,
            INFOTIP         = 0x00000004,
            CLSID           = 0x00000008,
            ICONFILE        = 0x00000010,
            LOGO            = 0x00000020,
            FLAGS           = 0x00000040
        }
    }
}
'@ -OutputAssembly "$ScriptFiles\Set-FolderProps.dll"

### Set-FolderProps.ps1 cration ###
###    Script file as Here-String written
###    to $ScrptFiles folder selected by user

echo 'Creating "Set-FolderProps.ps1"...'

@'
Add-Type -Path "{0}\Set-FolderProps.dll"
$ThisWindow = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle

Switch ($Args[-1]) {
    'Rating'
    {
        [API]::ShowWindow($ThisWindow ,'Hide') | out-null
        $return = [Desktop.ini]::SetRating($Args[0],[Int]$Args[1])
        $Return = [Desktop.ini]::SetInfoTip($Args[0],([Desktop.ini]::GetInfoTip($Args[0])))
        @((New-Object -com shell.application).Windows()).Foreach({ $_.Refresh() })
    }
    'Comment'
    {
        [API]::ShowWindow($ThisWindow ,'Show') | out-null
        $Comment = Read-Host Comment
        [API]::ShowWindow($ThisWindow ,'Hide') | out-null
        $return = [Desktop.ini]::SetInfoTip($Args[0],$Comment)
        @((New-Object -com shell.application).Windows()).Foreach({ $_.Refresh() })
    }
}

'@ -replace ('\{0\}',$ScriptFiles) | Set-Content "$ScriptFiles\Set-FolderProps.ps1"

### AddProp.bat cration ###
###     Wrapper to hide PowerShell window flash

echo 'Creating "AddProp.bat"...'

@'
:: Batch wrappoer to hide PowerShell window

 cmd /c start /min "" powershell.exe -NoProfile -Command "{0}\Set-FolderProps.ps1" %1 %2 %3

:: Troubleshooting
:: powershell.exe -NoExit -NoProfile -Command "{0}\Set-FolderProps.ps1" '%1' %2 %3

::Usage: SetProp.bat %V <PropertyValue>[Rating|Comment]

'@ -f $ScriptFiles | Set-Content "$ScriptFIles\AddProp.bat"

echo 'Done!'

Я искал решение этой проблемы с папками " Рейтинг" и "Пометка" в Windows 7. Во время недавнего поиска я нашел ваш вопрос, а позже нашел этот полезный инструмент. Taggtool.

Он также может помечать / оценивать папки, как файлы. и вы можете искать на основе этих тегов. Я начал использовать этот инструмент и очень эффективно организовывал мою огромную коллекцию документов, изображений, видео и других типов.

Попробуйте это здесь: http://www.taggtool.com/.

Не забудьте " Запуск от имени администратора " во время выполнения установки, так как для этого требуются разрешения для доступа к файловой системе. Вы также можете увеличить размер шрифта в настройках, как только вы установили систему

Была такая же проблема только сейчас, и это работало отлично: после того, как вы перейдете на вкладку "Подробности" в "Свойствах", в нижней части окна есть ссылка "Удалить свойства и личную информацию". Нажмите на это и выберите "Удалить следующие свойства из этого файла" (опции вверху). Затем установите флажок Рейтинг и нажмите "ОК".

Лучшее, что я нашел, - это внешняя программа под названием XnView http://www.xnview.com/ она бесплатна для личного использования. Yoy может оценивать папки и файлы и задавать цвет, я обнаружил одну ошибку (но решаемую), которая заключается в том, что если диск с классифицированным материалом меняет имя устройства (G: F: и т. Д.), Классификации исчезают. Решение состоит в том, чтобы использовать функцию "Описание", вместо этого вы можете поместить туда число (или нужную вам цифру), данные дозы сохраняются в файле в том же каталоге секретных данных (что очень полезно и независимо от того, какой компьютер вы используете)

Я использовал тег и некоторые специальные символы ■, которые распознаются проводником, по крайней мере, для файлов, которые я использую (офис). Не идеально, но делает трюк для меня

Я имел в виду, что вы можете использовать несколько символов, чтобы "оценить" ваш файл ■ ■ ■ ■ ■ v хорошо ■ ■ ■ ■ хорошо и т. Д...

Вот что работает на Win7:

в вашей папке щелкните правой кнопкой мыши -> Сортировать по -> Еще...

Затем перейдите к "Рейтинг" и установите флажок.

Это просто. В проводнике Windows сначала нажмите "Упорядочить" и отобразите панель сведений. Затем щелкните файл, в котором отображается атрибут столбца рейтинга (может потребоваться сначала включить столбец рейтинга). В нижней части окна также отображаются звезды рейтинга. Дважды щелкните по звездному рейтингу, который вы хотите присвоить. Появится кнопка сохранения, затем нажмите "Сохранить", и она обновит атрибут рейтинга для этого файла.

Обратите внимание, что если файл в данный момент заблокирован, например, если файл открыт в другой программе, например, в музыкальном проигрывателе, вы не сможете изменить метаданные файла.

Другие вопросы по тегам