首页 > 解决方案 > 在 power shell 中,如何将我在文件夹中执行的操作复制到其他文件夹?

问题描述

我应该做的动作:

  1. 从文件夹中读取文件
  2. 从第一行提取日期
  3. 将其更改为“yyyymmdd”格式
  4. 通过删除前 4 个字符重命名所有文件并将此格式日期放在开头。

示例 FILE.FILE 将更改为 20180725.FILE(日期将在文件中)

我可以通过以下代码在Newpath中的单个文件夹中完成此操作:

$path="\\Data\DEV\DevDat\Arun\DXSL\Newpath\20170601"

$files=Get-ChildItem $path  | Select-Object -first 1

$data = Get-Content "$path\$files" -first 1
foreach($line in $data)
 {
 $arr = $line.substring(52,4)+$line.substring(46,2)+$line.substring(49,2)
}
get-childitem $path | rename-item -newname { $arr +[string]($_.name).substring(4)}

但是,我无法将此操作循环复制到其他文件夹。Newpath文件夹有几个子文件夹。我需要重命名Newpath中每个子文件夹中的文件。有什么办法可以做到这一点?

仅供参考,我正在使用版本 4 的 powershell。

标签: powershellloopsrenamefile-renamesubdirectory

解决方案


我的评论中建议的 PowerShell 脚本。

  • 它不检查要重命名的文件是否已经存在。
  • Rename-Item-WhatIf附加了参数,因此它仅显示将要执行的操作。
  • 如果第一行中有更多数字,则脚本将匹配第一个模式。
  • 该脚本也不检查文件是否已重命名为模式。

## Q:\Test\2018\07\25\SO_51522205.ps1
#Requires -Version 3.0
$BasePath = "\\Data\DEV\DevDat\Arun\DXSL\Newpath"

$RE = [RegEx]'(?<Month>\d{2}).(?<Day>\d{2}).(?<Year>\d{4})'

ForEach ($Folder in (Get-ChildItem -Path "$BasePath\*" -Directory)){
    ForEach ($File in (Get-ChildItem -Path "$($Folder.FullName)\*" -File)){
        $Line1 = (Get-Content $File.FullName | Select-Object -First 1)
        If ($File.BaseName.Length -gt 4){
            $BaseName = $File.BaseName.SubString(4)
        } else {
            $BaseName = ''
        }
        If ($Line1 -match $RE){
            $NewName = ("{0}{1}{2}{3}{4}" -f `
                $Matches.Year,
                $Matches.Month,
                $Matches.Day,
                $BaseName,
                $File.Extension)
            $File | Rename-Item -NewName $NewName -WhatIf
        } Else {
            "{0} doesn't have a proper date in 1st line" -f $File.FullName
        }
    }
}

之前的样本树,

> tree /F
└───Newpath
    └───20170601
            blahblah.txt
            FILE.FILE

运行脚本后。

> tree /F
└───Newpath
    └───20170601
            20180724blah.txt
            20180725.FILE

推荐阅读