diff --git a/PSEverything/Everything.cs b/PSEverything/Everything.cs index df477b0..dc3e7a5 100644 --- a/PSEverything/Everything.cs +++ b/PSEverything/Everything.cs @@ -1,6 +1,7 @@ using System; using System.Text; using static PSEverything.Status; +using System.IO; namespace PSEverything { @@ -25,7 +26,7 @@ public static class Everything public static void SetSearch(string text) { int res = Is64Bit ? NativeMethods64.Everything_SetSearchW(text) : NativeMethods32.Everything_SetSearchW(text); - if (res != (int) Ok) + if (res != (int)Ok) { Throw(res); } @@ -128,6 +129,15 @@ public static string GetFullPathName(int index, StringBuilder buf) return buf.ToString(); } + public static bool GetIsFolderResult(int index) + { + return Is64Bit ? NativeMethods64.Everything_IsFolderResult(nIndex: index) : NativeMethods32.Everything_IsFolderResult(nIndex: index); + } + + public static bool GetIsFileResult(int index) + { + return Is64Bit ? NativeMethods64.Everything_IsFileResult(nIndex: index) : NativeMethods32.Everything_IsFileResult(nIndex: index); + } public static void Cleanup() { @@ -151,6 +161,22 @@ public static string[] GetAllResults(int count) return retVal; } + public static FileSystemInfo[] GetAllResultsAsFileSystemInfo(int count) + { + FileSystemInfo[] retVal = new FileSystemInfo[count]; + StringBuilder buf = new(32767); + + for (int i = 0; i < count; ++i) + { + string path = GetFullPathName(i, buf); + retVal[i] = GetIsFileResult(i) ? (FileSystemInfo)new FileInfo(path) + : GetIsFolderResult(i) ? new DirectoryInfo(path) + : null; + buf.Clear(); + } + return retVal; + } + static int GetLastError() { return Is64Bit ? NativeMethods64.Everything_GetLastError() : NativeMethods32.Everything_GetLastError(); diff --git a/PSEverything/PSEverything.csproj b/PSEverything/PSEverything.csproj index 0cffb53..8e746c2 100644 --- a/PSEverything/PSEverything.csproj +++ b/PSEverything/PSEverything.csproj @@ -22,7 +22,7 @@ - + diff --git a/PSEverything/PSEverything.psd1 b/PSEverything/PSEverything.psd1 index d070171..684b185 100644 --- a/PSEverything/PSEverything.psd1 +++ b/PSEverything/PSEverything.psd1 @@ -1,24 +1,23 @@ @{ - RootModule = 'PSEverything.dll' - ModuleVersion = '3.3.0' - GUID = 'f262ec02-4a88-49e5-94da-e25aab9cbf7a' - Author = 'Staffan Gustafsson' - CompanyName = 'PowerCode Consulting AB' - Copyright = '(c) 2016 sgustafsson. All rights reserved.' - Description = 'Powershell access to Everything - Blazingly fast file system searches' - PowerShellVersion = '5.1' + RootModule = 'PSEverything.dll' + ModuleVersion = '3.3.1' + GUID = 'f262ec02-4a88-49e5-94da-e25aab9cbf7a' + Author = 'Staffan Gustafsson' + CompanyName = 'PowerCode Consulting AB' + Copyright = '(c) 2016 sgustafsson. All rights reserved.' + Description = 'Powershell access to Everything - Blazingly fast file system searches' + PowerShellVersion = '5.1' CompatiblePSEditions = "Desktop", "Core" - FunctionsToExport = '' - CmdletsToExport = 'Search-Everything', 'Select-EverythingString' - VariablesToExport = '' - AliasesToExport = 'se', 'sles' - FileList = 'Everything32.dll', 'Everything64.dll', 'LICENSE', 'PSEverything.dll', 'PSEverything.dll-Help.xml', 'PSEverything.psd1' - PrivateData = @{ + FunctionsToExport = '' + CmdletsToExport = 'Search-Everything', 'Select-EverythingString' + VariablesToExport = '' + FileList = 'Everything32.dll', 'Everything64.dll', 'LICENSE', 'PSEverything.dll', 'PSEverything.dll-Help.xml', 'PSEverything.psd1' + PrivateData = @{ PSData = @{ - Tags = @('Search', 'Everything', 'voidtools', 'regex', 'grep') - LicenseUri = 'https://raw.githubusercontent.com/powercode/PSEverything/master/LICENSE' - ProjectUri = 'https://github.com/powercode/PSEverything' + Tags = @('Search', 'Everything', 'voidtools', 'regex', 'grep') + LicenseUri = 'https://raw.githubusercontent.com/powercode/PSEverything/master/LICENSE' + ProjectUri = 'https://github.com/powercode/PSEverything' ReleaseNotes = @' 2.3: Bug fixes. Sorted output. 2.1: Upgrading to SDK matching 1.4.1.809b - Fixing hang when calling from Eleveated powershell @@ -38,4 +37,3 @@ Bug fix for -Filter that didn't work in combination with non-global searches. } } } - diff --git a/PSEverything/SearchEverythingCommand.cs b/PSEverything/SearchEverythingCommand.cs index 19bf251..8801b79 100644 --- a/PSEverything/SearchEverythingCommand.cs +++ b/PSEverything/SearchEverythingCommand.cs @@ -1,14 +1,16 @@ using System; using System.Management.Automation; using System.Text; +using System.IO; namespace PSEverything { [Cmdlet(VerbsCommon.Search, "Everything", SupportsPaging = true, DefaultParameterSetName = "default")] - [OutputType(new []{typeof(string)})] - [OutputType(new[]{typeof(string[])})] - [Alias(new[]{"se" })] - public sealed class SearchEverythingCommand : PSCmdlet , IDisposable + [OutputType(new Type[] { typeof(string) })] + [OutputType(new Type[] { typeof(string[]) })] + [OutputType(new Type[] { typeof(FileSystemInfo) })] + [OutputType(new Type[] { typeof(FileSystemInfo[]) })] + public sealed class SearchEverythingCommand : PSCmdlet, IDisposable { [Parameter(ParameterSetName = "default")] public string Filter { get; set; } @@ -22,19 +24,19 @@ public sealed class SearchEverythingCommand : PSCmdlet , IDisposable [Parameter(ParameterSetName = "default")] public string[] Extension { get; set; } - [Alias(new[] {"pi"})] + [Alias(new[] { "pi" })] [Parameter(ParameterSetName = "default")] public string[] PathInclude { get; set; } - [Alias(new[] {"pe"})] + [Alias(new[] { "pe" })] [Parameter(ParameterSetName = "default")] public string[] PathExclude { get; set; } - [Alias(new[] {"foi"})] + [Alias(new[] { "foi" })] [Parameter(ParameterSetName = "default")] public string[] FolderInclude { get; set; } - [Alias(new[] {"foe"})] + [Alias(new[] { "foe" })] [Parameter(ParameterSetName = "default")] public string[] FolderExclude { get; set; } @@ -68,6 +70,10 @@ public sealed class SearchEverythingCommand : PSCmdlet , IDisposable [Parameter()] public SwitchParameter AsArray { get; set; } + [Alias(["AsFS"])] + [Parameter()] + public SwitchParameter AsObject { get; set; } + private string GetSearchString() { if (ParameterSetName == "regex") { return RegularExpression; } @@ -167,7 +173,7 @@ void AddExtensionFilter(StringBuilder searchBuilder) foreach (var item in Extension) { - var ext = item.StartsWith(".") ? item.Substring(1) : item; + var ext = item.StartsWith(".") ? item.Substring(1) : item; searchBuilder.Append(ext); searchBuilder.Append(";"); } @@ -267,7 +273,8 @@ protected override void ProcessRecord() WriteDebug("Search-Everything search pattern:" + searchPattern); Everything.SetSearch(searchPattern); - try { + try + { Everything.Query(true); Everything.SortResultsByPath(); int resCount = Everything.GetTotalNumberOfResults(); @@ -276,8 +283,16 @@ protected override void ProcessRecord() var total = PagingParameters.NewTotalCount((ulong)resCount, 1.0); WriteObject(total); } - var res = Everything.GetAllResults(Math.Min(resCount, (int)first)); - WriteObject(res, enumerateCollection: !AsArray); + if (AsObject) + { + FileSystemInfo[] res = Everything.GetAllResultsAsFileSystemInfo(Math.Min(resCount, (int)first)); + WriteObject(res, enumerateCollection: !AsArray); + } + else + { + var res = Everything.GetAllResults(Math.Min(resCount, (int)first)); + WriteObject(res, enumerateCollection: !AsArray); + } } catch (Exception e) { @@ -290,4 +305,4 @@ void IDisposable.Dispose() Everything.Cleanup(); } } -} \ No newline at end of file +} diff --git a/PSEverything/SelectEverythingStringCommand.cs b/PSEverything/SelectEverythingStringCommand.cs index 69b23da..c804b4e 100644 --- a/PSEverything/SelectEverythingStringCommand.cs +++ b/PSEverything/SelectEverythingStringCommand.cs @@ -8,8 +8,7 @@ namespace PSEverything { [Cmdlet(VerbsCommon.Select, "EverythingString", DefaultParameterSetName = "default")] - [OutputType(new[]{"Microsoft.PowerShell.Commands.MatchInfo" })] - [Alias(new[] {"sles"})] + [OutputType(new[] { "Microsoft.PowerShell.Commands.MatchInfo" })] public class SelectEverythingStringCommand : PSCmdlet { static readonly string[] SearchParamNames = new[]{ @@ -49,7 +48,7 @@ public class SelectEverythingStringCommand : PSCmdlet [Parameter] public SwitchParameter NotMatch { get; set; } - [ValidateSet(new[]{"unicode", "utf7", "utf8", "utf32", "ascii", "bigendianunicode", "default", "oem" })] + [ValidateSet(new[] { "unicode", "utf7", "utf8", "utf32", "ascii", "bigendianunicode", "default", "oem" })] [ValidateNotNullOrEmpty] public string Encoding { get; set; } @@ -71,19 +70,19 @@ public class SelectEverythingStringCommand : PSCmdlet public string[] Extension { get; set; } [Parameter(ParameterSetName = "default")] - [Alias(new[] {"pi"})] + [Alias(new[] { "pi" })] public string[] PathInclude { get; set; } [Parameter(ParameterSetName = "default")] - [Alias(new[] {"pe"})] + [Alias(new[] { "pe" })] public string[] PathExclude { get; set; } [Parameter(ParameterSetName = "default")] - [Alias(new[] {"fi"})] + [Alias(new[] { "fi" })] public string[] FolderInclude { get; set; } [Parameter(ParameterSetName = "default")] - [Alias(new[] {"fe"})] + [Alias(new[] { "fe" })] public string[] FolderExclude { get; set; } [Parameter(ParameterSetName = "default")] @@ -124,7 +123,7 @@ protected override void EndProcessing() { if (bound.TryGetValue(sp, out object val)) { - searchParams.Add(sp == nameof(CaseSensitiveSearch) ? "CaseSenitive" : sp, val); + searchParams.Add(sp == nameof(CaseSensitiveSearch) ? "CaseSensitive" : sp, val); bound.Remove(sp); } } @@ -135,7 +134,8 @@ protected override void EndProcessing() bound.Remove(nameof(CaseSensitivePattern)); } var slsParams = bound; - using (_powershell = PowerShell.Create(RunspaceMode.CurrentRunspace)) { + using (_powershell = PowerShell.Create(RunspaceMode.CurrentRunspace)) + { _powershell.AddCommand("Search-Everything").AddParameters(searchParams); var paths = _powershell.Invoke().First(); if (_powershell.HadErrors) diff --git a/PSEverythingStandard/Class1.cs b/PSEverythingStandard/Class1.cs deleted file mode 100644 index cca626a..0000000 --- a/PSEverythingStandard/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace PSEverythingStandard -{ - public class Class1 - { - } -} diff --git a/Tests/PSEverythingTests/SelectEverythingTests.cs b/Tests/PSEverythingTests/SelectEverythingTests.cs index 84f15e8..db407b9 100644 --- a/Tests/PSEverythingTests/SelectEverythingTests.cs +++ b/Tests/PSEverythingTests/SelectEverythingTests.cs @@ -14,13 +14,14 @@ public class SelectEverythingTests public void TestSelectEverythingString() { var iss = InitialSessionState.CreateDefault2(); - iss.ImportPSModule(new []{(typeof(SelectEverythingStringCommand).Assembly.Location)}); + iss.ImportPSModule(new[] { (typeof(SelectEverythingStringCommand).Assembly.Location) }); using (var ps = PowerShell.Create(iss)) { ps.Commands.AddCommand("Select-EverythingString") - .AddParameter("-Extension", "ps1") + .AddParameter("-Extension", "psd1") .AddParameter("-Global", true) - .AddParameter("-Pattern", "function (\\S+)"); + .AddParameter("-Pattern", "RootModule") + .AddParameter("-Exclude", "$env:SystemRoot"); var res = ps.Invoke();