首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在目录树的任何部分放置的新文件上的Powershell重命名文件?

在目录树的任何部分放置的新文件上的Powershell重命名文件?
EN

Stack Overflow用户
提问于 2011-10-21 09:53:47
回答 3查看 1.5K关注 0票数 1

我从未使用过Powershell (或VBScript),因为我对IT-Admin很陌生,希望能对重命名文件提供一些指导。

每天,我将从一个名为YYYYMMDD的本地目录filder上手动从SFTP连接下载使用Filezilla的文件(不过,稍后我想编写一个自动任务,根据计划完成这个任务)。我想要设置的是一种任务,当文件进入分布式目录时,它们会被重命名。

对于今天的下载,我想重命名以下文件:

代码语言:javascript
复制
Original Name                   Renamed Filename
wcm14444.csv.11.10.20_09.32     wcm14444_111020_0932.csv
wcm14444.csv.11.10.21_00.09     wcm14444_111021_0009.csv
wcm14444.pdf.11.10.20_09.32     wcm14444_111020_0932.pdf
wcm14444.pdf.11.10.21_00.10     wcm14444_111021_0010.pdf
wcm1cash.csv.11.10.21_00.56     wcm1cash_111021_0056.csv
wcm1money.csv.11.10.21_00.56    wcm1money_111021_0056.csv
wcm1opnpos.csv.11.10.21_00.56   wcm1opnpos_111021_0056.csv
wcm1trades.csv.11.10.21_00.56   wcm1trades_111021_0056.csv
wcm1_an.pdf.11.10.21_03.26      wcm1_an_111021_0326.pdf
wcm1_ds.pdf.11.10.21_00.22      wcm1_ds_111021_0022.pdf
wcm1_ep.csv.11.10.21_03.26      wcm1_ep_111021_0326.csv
wcm1_ms.pdf.11.10.21_03.26      wcm1_ms_111021_0326.pdf

您会注意到我的重命名要求: 1.文件扩展名出现在文件名的中间,并放置到末尾。2.我要取代“”。用"“作为日期分隔器出现。如果有任何帮助,我只希望接收文件类型(".csv“、".pdf”、".xls"),如果这些文件出现在文件名中,它们将被替换为"_“。

目前,我会使用Excel来执行任务,但这似乎很难作为系统任务部署吗?这似乎更像是Powershell的一项任务。

如果我正在创建YYYYMMDD文件夹(例如N:\SFTP\Provider1 1\ YYYYMMDD ),那么在文件下载到YYYYMMDD中时,自动重命名文件的最佳方法是什么(注意在同一天可能没有创建文件夹,因为没有新的文件)。非常感谢和亲切的问候,伯蒂。

谢谢大家的帮助。更多的好处,这些绊脚石跨越这一页。我现在已经在N:\SFTP\Provider1 1中创建了一个包含Rename_SFTP.ps1文件

代码语言:javascript
复制
$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
$todayDate = Get-Date -Format "yyyyMMdd"

Get-ChildItem (".\" + $todayDate + "\") -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        echo $NewName
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item (".\" + $todayDate + "\" + $_) -NewName $NewName
    }
}

然后我创建了一个包含以下内容的RunRenameTaskForToday.bat

代码语言:javascript
复制
powershell .\Rename_SFTP.ps1

至少这样,当我手动下载文件时,我所需要做的就是双击一个更高层次的.bat文件,它会显示出需要重命名这些文件的正确文件夹。我所需要做的就是想出一个办法自动降低SFTP .

谢谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-21 13:48:14

下面是另一种使用格式字符串创建新名称的方法。括在括号中的每组模式字符表示要捕获的文件名的一部分,并在稍后的$NewName中使用以形成新的文件名:

代码语言:javascript
复制
$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'


Get-ChildItem D:\temp -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item $_ -NewName $NewName
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-21 12:01:51

这是一个相当复杂的任务,有几个问题(很可能还有几个解决方案)。下面是一些让你去的指南:

  • 使用Get-ChildItem | Foreach-Item遍历所有文件。$_保存当前项。
  • Powershell对正则表达式有很好的支持,使用if ($_ -match "regexp")。我倾向于命名火柴,以便更容易地识别它们。类似这样的内容可能适用于特定的命名格式: if ($s -match "(?<pre>.*)\.(?<ext>csv|pdf)(?<date>.*)_(?<hour>\d{2})\.(?<min>\d{2})") { $newname = $matches["pre"] + "_" + ($matches["date"] -replace "\.","") + "_" + $matches["hour"] + $matches["min"] + '.' + $matches["ext"] }
  • 要获得当前的数据,请使用Get-Date -Format "yyyyMMdd"。使用它每天创建一个新文件夹。
票数 2
EN

Stack Overflow用户

发布于 2011-10-21 13:28:33

很快就有一种叫做脆性的东西..。

代码语言:javascript
复制
$ext = ("csv", "pdf", "xls")

foreach ($e in $ext)
{    
  Get-ChildItem "*$e*" | % {$newName = $_.name.replace('.',''); $newName;
                            Rename-Item $_.fullname -NewName ($newName -replace "(.*)($e)(.*)",'$1_$3.$2')}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7847727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档