使用PowerShell进行筛选和复制

使用PowerShell进行筛选和复制,powershell,Powershell,为了提高我的PowerShell技能,这里有一个简单问题的丑陋解决方案示例。欢迎对如何改进oneliner提出任何建议 任务:修剪一个巨大的图标库,使其更易于管理。原始目录结构如下所示: /Apps and Utilities /Compile /32 Bit Alpha png /Compile 16 n p.png /+ 10 or more files /+ 5 more formats with 10 or more fil

为了提高我的PowerShell技能,这里有一个简单问题的丑陋解决方案示例。欢迎对如何改进oneliner提出任何建议

任务:修剪一个巨大的图标库,使其更易于管理。原始目录结构如下所示:

/Apps and Utilities /Compile /32 Bit Alpha png /Compile 16 n p.png /+ 10 or more files /+ 5 more formats with 10 or more files each /+ 20 or so icon names /+ 22 more categories /应用程序和实用程序 /编撰 /32位Alpha png /编译16 n p.png /+10个或更多文件 /+5种以上格式,每个格式包含10个或更多文件 /+20个左右的图标名称 /+22个以上类别 我想复制32位Alpha-png并将目录结构展平一点。以下是我快速而肮脏的解决方案:

$dest = mkdir c:\icons; gci -r | ? { $_.Name -eq '32 Bit Alph a png' } | % { mkdir ("$dest\" + $_.Parent.Parent.Name + "\" + $_.Parent.Name); $_ } | gci | % { cp $_. FullName -dest ("$dest\" + $_.Directory.Parent.Parent + "\" + $_.Directory.Parent) } $dest=mkdir c:\icons;gci-r |?{$\.Name-eq'32位Alph png'}|%{mkdir(“$dest\”++$\\\.Parent.Name++“\”++$\\\\\\.Parent.Name);$\\\\\\\\\\\}gci |%{cp$\。 全名-dest(“$dest\”+$\\\\.Directory.Parent.Parent+“\”+$\\.Directory.Parent)} 不太好,但它解决了我的问题。结果结构:

/Apps and Utilities /Compile /Compile 16 n p.png /etc /etc /etc /应用程序和实用程序 /编撰 /编译16 n p.png /等 /等 /等 你会怎么做?

三点意见:

  • 您没有在第一次测试后对结果进行隐式排序。这可能无关紧要(它们可能会被排序),但由于您正在基于Parent.Parent构建目录结构。。。我可以设想一个PNG图像列表,它会引起某种问题(不是双关语)
  • 也许我已经过时了,但我发现dir比gci更具可读性。在我自己的脚本中,我通常会尝试扩展大多数别名,因为这有助于提高PowerShell更新版本的可读性和可维护性
  • 与其将所有内容链接在一起,不如将块分解为变量并封装在cmdlet/函数中
将研究排序。在编写脚本时,我确实扩展了大多数别名,但我希望我的OneLiner简洁明了——尽管ls(或dir)比gci要好得多:)。