我刚刚开始进入powershell作为文件收集过程的解决方案。基本上它的要点是我想循环遍历具有开始通配符的文件目录,询问julian日期,然后根据该日期重命名该文件(格里高利)。
现在我只有代码(如下所示)根据今天的日期重命名文件,但这只是因为我无法编写足够高级的东西来做我想做的事情。捷径在100%的时间里都不会起作用。任何人都可以提供有关如何查询朱利安日期和重命名的任何帮助?
以下是重命名文件之前文件的外观示例,以及重命名文件后我希望它如何显示。
重命名之前 - COMPANY.DATA.J2016183.Y98173987(除了更改日期外,前3个部分是不变的。只有点后面的最后一个分隔部分才是我不需要的随机密钥。&# 34; J"是一个常数,因为它只是指朱利安。我需要询问的是" J")之后的日期。
重命名后所需的文件名 - DATA.2016-07-04.txt
$Today = (Get-Date).Date
$Day = $Today.AddDays(-2)
$newday = $Day.ToString("yyyy-MM-dd")
Get-ChildItem "\\fileserv\folder\COMPANY.DATA.*" -Recurse|
Rename-Item -NewName {'DATA.' + $newday + '.txt' }
(-2只与文件名/数据差异有关。文件名比实际数据提前2天)。
任何帮助将不胜感激。谢谢,
答案 0 :(得分:2)
这是一个将Julian转换为Gregorian的函数(来源:http://powershell.com/cs/media/p/18723.aspx):
<#
ALZDBA 20120831
#>
function Convert-JulianDateFormat2Date ( [int]$YYYYddd ) {
#######################
<#
.AUTHOR
ALZDBA 20120831
.SYNOPSIS
Convert YYYYddd to [date].
.DESCRIPTION
convert a numeric Julian date format to a regular date ( date datatype )
.INPUTS
$YYYYddd e.g. 2012245
.OUTPUTS
[date]
.EXAMPLE
Clear-Host
$mydate = Convert-JulianDateFormat2Date -YYYYddd 2012263
$mydate
$mydate.dayofyear
#>
$year = [int]( $YYYYddd / 1000 )*1000
$DayOfYear = $YYYYddd - $year
$date = Get-Date -Year ( $year/1000 ) -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
#$date.DayOfYear
$date = $date.AddDays( $DayOfYear - 1 )
$date
}
使用此功能,您可以按如下方式重命名文件:
$delim = "."
Get-ChildItem "\\fileserv\folder\COMPANY.DATA.*" -Recurse |
foreach {
$nameArray = $_.Name.Split($delim)
# CONVERT DATE:
$jDate = $nameArray[2].Replace("J","")
$mydate = Convert-JulianDateFormat2Date -YYYYddd $jDate
$newDate = $mydate.ToString("yyyy-MM-dd")
#RENAME FILES:
$newName = $nameArray[1]+$delim+$newDate+$delim+$nameArray[4]
Rename-Item $_ -NewName $newName
}
答案 1 :(得分:0)
Ryan Drane在这里有一篇关于这个问题的好文章:http://www.ryandrane.com/2015/04/convert-julian-date-to-gregorian-date-in-powershell/
他为您的应用程序修改过的方法看起来像这样:
$filename = "COMPANY.DATA.J2016183.Y98173987"
$JulianYear = $filename.Substring(14,4)
$JulianDay = $filename.Substring(18,3)
$GregorianDate = (Get-Date -Year $JulianYear -Month 01 -Day 01).AddDays($JulianDay - 1)
虽然该代码确实返回附加时间的格里高利日期,但删除它并不是很多工作,并添加文件处理方法。