我有一个服务器有数百个子目录,可能包含扩展名为.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 }
好的,我会尽力把这个打破。
dir
。 在由变量$ path指定的起始路径中搜索所有文件和目录。 我知道这不是你想要的,而是继续阅读 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
是默认情况下不区分大小写。 如果所有上述条件都满足,则取每个文件并通过ForEach-Object进行处理。 请注意,这可以直接送入其他PowerShell cmdlet,但我试图保持这个基本。
Add-Content
将文件的完整路径输出到日志中 $copyPath
指定的$copyPath
.ps1
的文件中,然后双击它。 #
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不打扰别的东西。