假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中都有不同数量的文件夹,这些文件夹以年份开始和结束日期命名。所有文件夹都包含一组不同的“年份文件夹”。
例如:
C:\测试\ A \ 20050101-20051231
C:\测试\ A \ 20060101-20061231
C:\测试\ A \ 20070101-20071231
C:\测试\ B \ 20140101-20141231
C:\测试\ B \ 20150101-20151231
C:\测试\ B \ 20160101-20161231
C:\测试\ C \ 20090101-20091231
C:\测试\ C \ 20100101-20101231
C:\测试\ C \ 20110101-20111231
我需要帮助创建一个PowerShell脚本,搜索这些文件夹然后移动根文件夹,在本例中为“C:\ A”,从2009年到2016年没有任何年份文件夹。不幸的是我可以'使用时间戳。
试着用这个开头,但它只是从结果中排除子文件夹。
Get-ChildItem -Depth 1 | ?{ $_.PSIsContainer } | where {$_.name -notlike "2013"}| Select-Object FullName
由于
答案 0 :(得分:1)
您需要循环使用这些年并将它们与子文件夹名称进行比较。
您可以在Where-Object
表达式中执行此操作:
Get-ChildItem -Depth 1 -Directory |Where-Object {
$Subfolders = Get-ChildItem $_.FullName |Select -Expand Name
foreach($year in 2009..2016){
if($Subfolders -contains $year){
return $false
}
}
return $true
}
答案 1 :(得分:1)
如果文件夹结构始终相同,这将起作用。
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory |
Where-Object -Property Name -In -Value (2009..2016)
)
}
为2009年至2016年之间没有年份的每个文件夹返回一个文件系统对象,在最后| Remove-Item -Recurse
旁边添加}
以删除文件夹。
修改强>
谢谢!刚注意到这些文件夹的格式为20090101-20091231,20100101-20101231。那怎么办呢?
稍微改了一下。使用没关系各种各样的错误。只需切换到Name
的{{1}}参数并切换内部where语句的边,这样我们就可以使用Get-ChildItem
运算符并在名称后附加一个通配符。like
即可使用FilterScript
方法。
SubString()
答案 2 :(得分:0)
其他解决方案(PowerShell V5)
Get-ChildItem "c:\test\*" -directory | % {
$currentdir=$_.FullName
$listcurrentdir=gci $currentdir -Directory | % {$_.name.Substring(0, 4)}
2009..2016 | % { if ($_ -notin $listcurrentdir) {[pscustomobject]@{Dir=$currentdir; Year=$_}} }
}
答案 3 :(得分:0)
$cat_args = array(
'parent' => 0,
'hide_empty' => 0,
'order' => 'ASC',
);
$categories = get_categories($cat_args);
foreach($categories as $category){
echo get_cat_name($category->term_id);
}