我有这个脚本,定期运行收集桌面文件和文件类型组织他们到备份驱动器上的单个文件夹。
function get-destbytype($ext)
{
switch ($ext)
{
{ $ext -match '(jpg|png|gif|bmp)'} { "images" }
{ $ext -match '(divx|mpeg|avi)'} { "videos" }
{ $ext -match '(cs|js|java|py|class|vbs|jsp)'} { "code" }
{ $ext -match '(sql|ps1|pl|py)'} { "scripts" }
{ $ext -match '(zip|7z|rar)'} { "compressed" }
{ $ext -match '(ppt|pptx|doc|docx|pdf)'} { "documents" }
{ $ext -match '(csv|xls|xlsx)'} { "spreadsheets" }
{ $ext -match '(exe|dll|jar|ear|bat|cmd)'} { "executables" }
{ $ext -match '(txt|log)'} { "text" }
{ $ext -match '(msg|htm|html|lnk)'} { "miscellaneous" }
{ $ext -match '(properties|xml|ini)'} { "config" }
default {"$ext" }
}
}
$dirtyfolder = "C:\Documents and Settings\user\Desktop\"
$org = "$nas\Desktop\ORG"
ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{
$dest = "$($org)\$(get-destbytype $_.extension)"
if (! (Test-Path -path $dest ) )
{
write-host "creating $dest"
new-item $dest -type directory
}
mv -path $_ -destination $dest
}
该剧本被彻底的测试,似乎运行在大多数情况下,我能想象的罚款。最近当.csv
文件中遇到的第一次,他们被命名移动到一个新的文件夹
code spreadsheets
。
这显然是因为.cs
文件都应该去code
文件夹和文件.csv
到spreadsheets
文件夹,脚本不.cs
和.csv
区分。
如何修改剧本不这样做?
还可以做些什么,以排除具有扩展.lnk
桌面快捷方式?
尝试使用更具体的正则表达式。就在你的表情的末尾添加$迹象。该$符号指示线或字符串你的情况最终结束。
它是这样的:
{ $ext -match '(jpg|png|gif|bmp)$'} { "images" }
您可以轻松地通过打开PowerShell和打字测试:
"abc.csv" -match '(cs|xls)$'
这将导致错误。
另一个最佳实践是在每个条件的末尾添加一个break语句。也就是说,当找到匹配所有其它条件都没有经过测试。它也将作出比较快。
{ $ext -match '(jpg|png|gif|bmp)$'} { "images"; break}
更具体的正则表达式是一个可能的解决方案。更处理器友好一种是从订购到最不具体的开关语句,包括每个案件后,“破发”的指令。这样,当你匹配“CSV”这将退出评估的其他情形。
你的错误输出的两种情况相匹配的结果,并返回这两个值。更紧密的正则表达式会导致只有一个大小写敏感的匹配,但你还是每一个元素评估时,你可能没有意思,也没有意识到这会发生。使用在每种情况下破指令另一种方式是更加明确,节省了几个周期。
您可以在ls命令的参数快捷方式添加例外。
ls $dirtyfolder/* | ? {(!$_.PSIsContainer) -and !($_.extension -eq ".lnk")}