在批处理或PowerShell中目录名称包含特定文本的一组目录中移动超过90天的文件

我有一个服务器有数百个子目录,可能包含扩展名为.flv的文件超过90天。 我需要find这些文件,但只能在名称中包含“ProdStream”字样的文件夹中。

这样做的目的是将文件存档到AWS(我有一个适用于此的脚本),将文件的原始path保存在日志中。

我可以使用forfiles在所有子文件夹中find文件:

forfiles /P "SRC_PATH" /S /M *.flv /D -90 /C "cmd /C move @file "DEST_PATH"" 

但是,forfiles不允许我使用文件夹名称作为variables。 至less不是我所尝试过的。 所以我尝试使用for命令。

 set stream=SRC_PATH FOR /D /R %stream% %%X IN (ProdStream*) DO [something] 

这是有效的,但只是部分,因为我找不到正确的命令,以便在DO之后find文件。

我还需要保存具有完整path信息的文件列表。 我一直在使用这个:

 forfiles /P "SRC_PATH" /S /M *.flv /D -90 /C "cmd /C echo @path @fsize" >MY_LOG_FILE 

哪些工作,但不过滤文件夹名称中的ProdStream文本。

我打开在PowerShell中以及批处理。

我的PowerShell很弱,但它可以变得更强大!

想法?

服务器是Windows 2008 R2企业版SP1

试试这个如果为你工作:

 For /f "delims=" %%a in ('dir /ad/b/sc:\yourfolder\*Prodstream*') do ( forfiles /P "%%~fa" /M *.flv /D -90 /C "cmd /C move @file "DEST_PATH"" ) 

我希望不要把你的PowerShell,但既然你愿意考虑这个选项我提出以下

 $Path = "C:\temp" $FolderFilter = "ProdStream" $copyPath = "C:\archive" $log = "c:\log" Get-ChildItem -Path $Path -Recurse | Where-Object { ! $_.PSIsContainer -and $_.Extension -eq ".flv" -and $_.CreationTime -lt (Get-Date).Adddays(-90) -and ($_.FullName -split "\\")[-2] -match $FolderFilter } | ForEach-Object{ Add-Content -Path $log "The following was archived $($_.FullName)" #Copy-Item -Path $_.FullName -Destination $copyPath } 

好的,我会尽力把这个打破。

  1. 使用Get-ChildItem。 它像cmd的dir 。 在由变量$ path指定的起始路径中搜索所有文件和目录。 我知道这不是你想要的,而是继续阅读
  2. Where-Object子句是魔术发生在你匹配文件的标准的地方。 我会打破这个条件

    • $_.PSIsContainer 。 我会假设你有一个旧版本的PowerShell。 这将返回所有文件,而不是目录。
    • $_.Extension -eq ".flv" 。 你想要.flv说服的文件。
    • $_.CreationTime -lt (Get-Date).AddDays(-90) 。 这将检查并查看文件的创建时间是否早于90天。
    • ($_.FullName -split "\\")[-2] 。 这种情况将采取文件路径,并将其转换成文件夹和文件的数组。 获取该数组并返回第二个最后一个项目,该项目将成为相关文件的文件夹名称。 示例将是C:\temp\ProdStreamStuf\IMG_0571.JPG将返回ProdStreamStuf 。 取父文件夹名称,看它是否包含$FolderFilter ,在我们的例子中是ProdStream 。 如果和部分名称包含ProdStream-match将返回true 。 此外, -match是默认情况下不区分大小写。
  3. 如果所有上述条件都满足,则取每个文件并通过ForEach-Object进行处理。 请注意,这可以直接送入其他PowerShell cmdlet,但我试图保持这个基本。

  4. 您提到您想将定位的文件存储在日志中,以便使用Add-Content将文件的完整路径输出到日志中
  5. 完成后,将文件复制到由$copyPath指定的$copyPath
  6. 将其保存到扩展.ps1的文件中,然后双击它。
  7. 为了测试,我在这一行上放了一条注释# Copy-Item -Path $_.FullName -Destination $copyPath它将阻止它运行,您可以只读$log ,看看它是否会移动您想要的文件。 那么如果它正在工作删除#

注意如果您通常不运行PowerShell脚本,您将收到有关ExecutionPolicy的错误。 如果是这样的话,你可以打开一个PowerShell会话并运行这个Set-ExecutionPolicy remotesigned ,这将允许在计算机上允许本地未签名的脚本(就像你刚才所做的那样),同时确保来自因特网的脚本需要被签名。 你也需要改变所有的$变量来匹配你需要的路径。 另外,根据你有多少个文件和文件夹,你可以重新排列条件。 PowerShell中的条件从左到右进行评估。 如果其中一个是错误的,那么就不会评估其余的。 所以你可以把($_.FullName -split "\\")[-2] -match $FolderFilter首先($_.FullName -split "\\")[-2] -match $FolderFilter这样,如果父文件夹不包含ProdStream不打扰别的东西。