【问题标题】:Find folder by date criteria deep in file structure在文件结构深处按日期标准查找文件夹
【发布时间】:2016-06-28 20:05:34
【问题描述】:

文件夹结构:

\\server\DropFolder.
├───PRD
│   ├───CTASales
│   │   └───v1.7
│   │           setup.bat
│   │
│   ├───CTASalesDeleteItems
│   │   └───v1.1
│   │           setup.bat
│   │
│   └───Feature1
│       └───v1.3.1
│               setup.bat
│
└───STG
    ├───CTASales
    │   ├───v1.7
    │   │       setup.bat
    │   │
    │   └───v1.8.1
    │           setup.bat
    │
    ├───CTASalesDeleteItems
    │   └───v1.1
    │           setup.bat
    │
    └───Feature1
        └───2.7
                setup.bat

如果版本文件夹 vx.x.x 是在 12 小时内创建的,我需要执行我的代码来对 setup.bat 文件进行自定义查找和替换。我是否需要一个 foreach 循环来进入 PRD/STG 然后另一个循环来查看每个 CTA 文件夹以查看版本创建时间?

到目前为止的代码:

Clear-Host
$Radsdrop = '\\SERVER\DROPFOLDER'
$date = Get-Date
$hours = '-9999999'

foreach ($env in (Get-ChildItem $RadsDrop -Directory))
{ 
   if($env.Name -eq 'STG')
   {    
     Get-ChildItem $Radsdrop -Recurse -Filter 'setup.bat' | 
       Where-Object {$_.Parent.CreationTime -gt (Get-Date).AddHours($hours)} | 
       Get-Content -Filter 'setup.bat' |
       ForEach-Object
      { 
        $_ -replace 'dev', 'stg' `
      } | Set-Content c:\setup.bat
    }
}

我不确定如何获取 bat 文件的内容并将其设置回适当的文件夹。

【问题讨论】:

    标签: powershell replace find


    【解决方案1】:

    您可以使用Get-ChildItem cmdlet 获取所有setup.bat,然后使用Where-Object cmdlet 过滤所有超过12 小时的父目录:

    Get-ChildItem '\\server\DropFolder' -Recurse -Filter 'setup.bat' | 
        Where-Object {$_.Parent.CreationTime -le (Get-Date).AddHours(12)} |
        ForEach-Object {
            # do your find and replace with $_
        }
    

    编辑您的评论:

    Get-ChildItem '\\server\DropFolder' -Recurse -Filter 'setup.bat' | 
        Where-Object {$_.Parent.CreationTime -le (Get-Date).AddHours(12)} |
        ForEach-Object {
            $content = Get-Content $_            
            if ($_.Parent.BaseName -eq 'STG')
            {            
                $content = $content -replace 'dev', 'stg'   
            }
            elseif ($_.Parent.BaseName -eq 'PRD')
            {
                $content = $content -replace 'prd', '' 
            }    
            $content | Set-Content $_
        }
    

    【讨论】:

    • 不错,不错,不错:)。我一直想知道$_.Parent是否给了你完整的(父母)FSO
    • @sodawillow 谢谢。 $_.ParentSystem.IO.DirectoryInfo 的第一个父级。或者FSO 是什么意思?
    • "文件系统对象" - 你回答了我的问题 :)。
    • @MartinBrandl 感谢您的回复。这是一种巧妙的方法。我唯一的困惑是,在我的 Set-Content 部分之后我需要做什么?还在弄乱它,所以我可能很快就会想出一些东西......
    • 你的意思是你需要传递给它什么?如果您向我们展示您的脚本,我相信我们可以帮助您,只需编辑您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多