我从未使用过Powershell (或VBScript),因为我对IT-Admin很陌生,希望能对重命名文件提供一些指导。
每天,我将从一个名为YYYYMMDD的本地目录filder上手动从SFTP连接下载使用Filezilla的文件(不过,稍后我想编写一个自动任务,根据计划完成这个任务)。我想要设置的是一种任务,当文件进入分布式目录时,它们会被重命名。
对于今天的下载,我想重命名以下文件:
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文件
$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
powershell .\Rename_SFTP.ps1至少这样,当我手动下载文件时,我所需要做的就是双击一个更高层次的.bat文件,它会显示出需要重命名这些文件的正确文件夹。我所需要做的就是想出一个办法自动降低SFTP .
谢谢大家。
发布于 2011-10-21 13:48:14
下面是另一种使用格式字符串创建新名称的方法。括在括号中的每组模式字符表示要捕获的文件名的一部分,并在稍后的$NewName中使用以形成新的文件名:
$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
}
}发布于 2011-10-21 12:01:51
这是一个相当复杂的任务,有几个问题(很可能还有几个解决方案)。下面是一些让你去的指南:
Get-ChildItem | Foreach-Item遍历所有文件。$_保存当前项。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"。使用它每天创建一个新文件夹。发布于 2011-10-21 13:28:33
很快就有一种叫做脆性的东西..。
$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')}
}https://stackoverflow.com/questions/7847727
复制相似问题