使用 powershell 进行高级文件搜索
Advance file search with powershell
我对 Powershell 和一般编程还很陌生。我想使用具有多个条件的 Powershell 搜索文件。我设法写出了这段代码
$Drives = Get-PSDrive -PSProvider 'FileSystem'
$Filename= 'Result'
$IncludeExt= '*csv,*docx'
$StartDate= '11/1/20'
$EndDate= '1/26/21'
Get-ChildItem -Path $Drives.Root -Recurse |Where-Object {$IncludeExt -match $_.Extension} | Where-Object { $_.BaseName -match $Filename} | Where-Object {$_.lastwritetime -ge $StartDate -AND $_.lastwritetime -le $EndDate} |
foreach{
$Item = $_.Basename
$Path = $_.FullName
$Type = $_.Extension
$Age = $_.CreationTime
$Path | Select-Object `
@{n="Name";e={$Item}},`
@{n="Created";e={$Age}},`
@{n="filePath";e={$Path}},`
@{n="Folder/File";e={if($Folder){"Folder"}else{$Type}}}`
}| Export-Csv D:\FFNew.csv -NoTypeInformation
当提到所有变量时,这很有效。但是在
时我如何让它工作
案例 1:如果 $Filename 为空,则它会提供所有具有上述扩展名的文件和在日期范围内修改的文件
案例 2:如果 $IncludeExt 留空,则它会提供所有提到 $Filename 的文件,目前它只提供在日期范围内修改的文件夹和文件
情况 3:如果 $Filename 和 $IncludeExt 留空,它会给出在 $StartDate 和 $EndDate
之间修改的所有文件
普拉奈,
[编辑]
好的,这是修改后的(准确的)脚本,带有注释和示例输出。注意:您必须更改特定于我的机器的项目!
$Drives = Get-PSDrive -PSProvider 'FileSystem'
$Filename = "*" #for all or "*partial name*"
$IncludeExt = $Null #for no ext. or "*.csv","*.docx",etc...
$StartDate = '01/1/2020' #to ignore this use 1/1/1920
#For latest date use below otherwise specify date.
$EndDate = (Get-Date).ToShortDateString()
#Note: below uses only 3rd drive in the array remove [2] for all.
$GCIArgs = @{Path = $Drives[2].Root
Recurse = $True
}
If ($Null -ne $IncludeExt) {
$GCIArgs.Add("Include",$IncludeExt)
}
Get-ChildItem @GCIArgs |
Where-Object {($_.BaseName -Like $Filename) -and
($_.lastwritetime -ge $StartDate) -and
($_.lastwritetime -le $EndDate) } |
foreach{
$Item = $_.Basename
$Path = $_.FullName
$Type = $_.Extension
$Type = & {if($_.PSIsContainer){"Folder"}else{$_.Extension}}
$Age = $_.CreationTime
$Path | Select-Object @{n="Name" ;e={$Item}},
@{n="Created" ;e={$Age}} ,
@{n="filePath" ;e={$Path}},
@{n="Folder/File";e={$Type}}
} | Export-Csv -LiteralPath 'G:\BEKDocs\FFNew.csv' -NoTypeInformation
备注:
- $IncludeExt 如果未使用则指定为 $Null,如果使用则列表如下所示“.csv”,“.docx”
- $Filename 被指定为所有文件名的“*”。还将测试从 -match 更改为 -like,因此部分文件名应包含 *,例如“部分名称”。
- 请注意,我将检查扩展的位置更改为使用 Get-ChildItem 的 -Include 参数,而不是检查 Where-Object。
- 将数据的管道更改为连续的 Where-Object 子句并替换为 -and 运算符,效果相同且更高效。
- 更改目录测试以使用 PSIsContainer 属性,看不到您从哪里获取 $Folder 的值。
- 从 Select-Object 中删除了连续字符,因为逗号用于此目的并且更清晰。
单驱动器上的示例输出(根据上面显示的代码)出于 space 的考虑隐藏了一些行,但请注意最后的行号。
所有驱动器上的示例输出(根据代码中的注释编辑代码),再次为 space 隐藏行,但显示多个驱动器和最后的行号。
HTH
我对 Powershell 和一般编程还很陌生。我想使用具有多个条件的 Powershell 搜索文件。我设法写出了这段代码
$Drives = Get-PSDrive -PSProvider 'FileSystem'
$Filename= 'Result'
$IncludeExt= '*csv,*docx'
$StartDate= '11/1/20'
$EndDate= '1/26/21'
Get-ChildItem -Path $Drives.Root -Recurse |Where-Object {$IncludeExt -match $_.Extension} | Where-Object { $_.BaseName -match $Filename} | Where-Object {$_.lastwritetime -ge $StartDate -AND $_.lastwritetime -le $EndDate} |
foreach{
$Item = $_.Basename
$Path = $_.FullName
$Type = $_.Extension
$Age = $_.CreationTime
$Path | Select-Object `
@{n="Name";e={$Item}},`
@{n="Created";e={$Age}},`
@{n="filePath";e={$Path}},`
@{n="Folder/File";e={if($Folder){"Folder"}else{$Type}}}`
}| Export-Csv D:\FFNew.csv -NoTypeInformation
当提到所有变量时,这很有效。但是在
时我如何让它工作案例 1:如果 $Filename 为空,则它会提供所有具有上述扩展名的文件和在日期范围内修改的文件
案例 2:如果 $IncludeExt 留空,则它会提供所有提到 $Filename 的文件,目前它只提供在日期范围内修改的文件夹和文件
情况 3:如果 $Filename 和 $IncludeExt 留空,它会给出在 $StartDate 和 $EndDate
之间修改的所有文件普拉奈,
[编辑] 好的,这是修改后的(准确的)脚本,带有注释和示例输出。注意:您必须更改特定于我的机器的项目!
$Drives = Get-PSDrive -PSProvider 'FileSystem'
$Filename = "*" #for all or "*partial name*"
$IncludeExt = $Null #for no ext. or "*.csv","*.docx",etc...
$StartDate = '01/1/2020' #to ignore this use 1/1/1920
#For latest date use below otherwise specify date.
$EndDate = (Get-Date).ToShortDateString()
#Note: below uses only 3rd drive in the array remove [2] for all.
$GCIArgs = @{Path = $Drives[2].Root
Recurse = $True
}
If ($Null -ne $IncludeExt) {
$GCIArgs.Add("Include",$IncludeExt)
}
Get-ChildItem @GCIArgs |
Where-Object {($_.BaseName -Like $Filename) -and
($_.lastwritetime -ge $StartDate) -and
($_.lastwritetime -le $EndDate) } |
foreach{
$Item = $_.Basename
$Path = $_.FullName
$Type = $_.Extension
$Type = & {if($_.PSIsContainer){"Folder"}else{$_.Extension}}
$Age = $_.CreationTime
$Path | Select-Object @{n="Name" ;e={$Item}},
@{n="Created" ;e={$Age}} ,
@{n="filePath" ;e={$Path}},
@{n="Folder/File";e={$Type}}
} | Export-Csv -LiteralPath 'G:\BEKDocs\FFNew.csv' -NoTypeInformation
备注:
- $IncludeExt 如果未使用则指定为 $Null,如果使用则列表如下所示“.csv”,“.docx”
- $Filename 被指定为所有文件名的“*”。还将测试从 -match 更改为 -like,因此部分文件名应包含 *,例如“部分名称”。
- 请注意,我将检查扩展的位置更改为使用 Get-ChildItem 的 -Include 参数,而不是检查 Where-Object。
- 将数据的管道更改为连续的 Where-Object 子句并替换为 -and 运算符,效果相同且更高效。
- 更改目录测试以使用 PSIsContainer 属性,看不到您从哪里获取 $Folder 的值。
- 从 Select-Object 中删除了连续字符,因为逗号用于此目的并且更清晰。
单驱动器上的示例输出(根据上面显示的代码)出于 space 的考虑隐藏了一些行,但请注意最后的行号。
所有驱动器上的示例输出(根据代码中的注释编辑代码),再次为 space 隐藏行,但显示多个驱动器和最后的行号。