使用Powershell从文件名为Name和DateTime的文件中查找季度

使用Powershell从文件名为Name和DateTime的文件中查找季度,powershell,batch-file,Powershell,Batch File,好吧,我在这里开始迷路了 我有一个包含名称和日期时间作为文件名的文件。所以我在ADATE变量中提取日期 示例名称--> PN-PN-EAST——GHI-QUOTERNATIONAL-Exceptions-2017-07-03-08-02-11.xlsx中DEF水平下ABC的百分比 PN-PN-EAST——GHI-Monthly-Exceptions-2017-06-02-09-04-14.CSV中DEF水平下ABC的百分比 for /D %%d in ("C:\AA\*") do ( for %

好吧,我在这里开始迷路了

我有一个包含名称和日期时间作为文件名的文件。所以我在ADATE变量中提取日期

示例名称--> PN-PN-EAST——GHI-QUOTERNATIONAL-Exceptions-2017-07-03-08-02-11.xlsx中DEF水平下ABC的百分比

PN-PN-EAST——GHI-Monthly-Exceptions-2017-06-02-09-04-14.CSV中DEF水平下ABC的百分比

for /D %%d in ("C:\AA\*") do (
for %%a in ("%%d\*.*") do (SET "FPath=%%~dpa"
Set "FName=%%~na" )  
)
::echo %FPath%/%FName%
::timeout 4

For /F "Tokens=4-9 Delims=-" %%A In ("%FName%") Do (
Set "Freq=%%B"
Set "ADate=%%F%%E%%D"
)
到目前为止,它已按预期工作(查找月份)

但现在我想从文件名中提取日期,减去一个月,然后转换/查找相同的季度

For /F UseBackQ %%A In (
    `Powershell "([datetime]::ParseExact('%ADate%','%DFormat%',[System.Globalization.CultureInfo]::CurrentCulture)).AddQuarter(-1).ToString('M')"`
 ) Do Set "DateF=%%A"
预计-2017年第一季度、2017年第二季度等

请注意,该文件不是以下文件的副本:
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于(“%sourcedir%”中的/D%%D,请执行以下操作(
对于(“%%d\*-*-*-*-*.*)中的%%a,请执行(设置“FPath=%%~dpa”
设置“FName=%%~na”
呼叫:进程
)  
)
后藤:eof
:进程
回显%FPath%/%FName%
::超时4
对于/F“Tokens=4-9 Delims=-”%%A In(“%Fname%”)Do(
设置“频率=%%B”
设置“ADate=%F%%E%%D”
集合/a qtr=((100%%E%%100-2^)/3^)+1
如果“%%E”==“01”(集合/a qtr=4&集合/a年=%%F-1)其他(集合/a年=%%F)
)
回音Q%qtr%-%year%
回声%freq%
回音%adate%
后藤:EOF
您需要更改
sourcedir
的设置以适应您的环境

我修改了文件掩码,只选择符合所提供模式的文件。您可能需要进一步完善此功能

请注意,对每个匹配的文件名执行例程
:进程
。需要在
:process
例程中执行每个文件所需的任何处理-您没有提到所需的处理,因此通过
:process
例程中的
echo
语句显示各种提取和处理的元素

提取季度(文件处理日期之前的一个月)的附加处理是首先字符串
100
(我假设您的月份元素出现在
%%E
)中,取结果的mod-100,减去2(原始的2月-4月为0..2,5月-7月为3..5,等等);将结果除以3,再加1

1月是一个特例,因此如果月份是1月,季度是4,年份减少1,否则年份(我假设)在
%%F


我不知道PS代码是怎么回事。

这有助于检索所需的数据吗

@Echo关闭
SetLocal EnableDelayedExpansion
对于/D%%A In(“AA\*”)Do(对于%%B In(%%A\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*.*),Do(
对于/F“令牌=5,7-9 Delims=-”%%C In(“%%~nB”)Do(Echo%%~fB
回显文件路径=%%~dpB
回波频率=%%C
对于/F“UseBackQ令牌=1-2”%%G In(
`Powershell“([datetime]::ParseExact('%D%%E%%F','yyyyymmdd',[System.Globalization.CultureInfo]::CurrentCulture)).AddMonths(-1).ToString('MM-yyyy')”`
)Do(设置/A“夸脱=(1%%G-101)/3+1”
预期回波=Q!夸脱!-%%H)
回声=))
暂停
我假设文件名中的日期信息的格式为
yyyy-MM-dd
,如果该格式应为
yyy-dd-MM
将第8行上的
yyyyymmdd
更改为
yyyydmm

临时编辑

Ashu,创建这个精确的脚本QTest.cmd,然后运行它:

@Echo关闭
SetLocal EnableDelayedExpansion
对于%%G英寸(01 02 03 04 05 06 07 08 09 10 11 12
)Do(设置/A“夸脱=(1%%G-101)/3+1”
回声Q!夸脱!)
暂停

您可以看到,所有12个月都按预期工作,因此请向我解释为什么您认为脚本无法读取“!”

对我以前的实现进行了一些调整,并且它现在所有月都在工作

([int]([datetime]::ParseExact('%ADate%','%DFormat%',[System‌​.Globalization.Cultu‌​reInfo]::CurrentCult‌​ure)).AddMonths(-1))​.ToString('MM'))"

有关更多详细信息-

如果您至少提供一个正在解析的文件名示例来修改您的问题,肯定会有所帮助。此外,当你声明你在本季度之后,你需要定义你的意思。我的回答提供了日历季度,如果您需要财政季度,它们在不同的国家是可变的,因此您需要准确地解释确定财政季度的标准,作为对您问题的修正!大家好,我在中添加了示例文件名question@Compo我使用的是日历季度,感谢高亮度的灯光。我不是这方面的玩家,正如你所说,我有日期的位置和日期部分的顺序,但需要根据文件减去几天/月/周。并从stackoverflow上的另一个线程获取了此代码。也许你能提供更多更好的选择。如果可能的话。我已经根据您现在提供的文件名更新了我的答案。哦,顺便说一句,你从我这里得到了密码!我正在使用。对于(
Powershell)([datetime]::ParseExact(“%ADate%”、“%DFormat%”、[System.Globalization.CultureInfo]::CurrentCulture)).AddMonths(-1).ToString('MM')”
)Do(Set/A“FPart1=%A/3”)中的/F UseBackQ%%A,它在除10(10月)之外的所有月份都有效你能检查一下吗?当你在同一个数据集上运行我上面的整个脚本时会发生什么?我一直在努力帮助你回答问题,至少你能做的是让我有礼貌地尝试一下,并提供反馈,如果不是为了你自己,也是为了网站和未来读者的利益。我提供了一个完整的脚本作为我的答案,并附有说明,如果我的假设不正确,只有你才能更改其中的部分。对相同的数据运行它,它应该是好的,更改它,它可能会有问题。我猜不出你添加、删除或修改了什么,因此无法帮助你,除非你给出答案,添加失败的确切脚本,验证源信息,并给我合理的帮助机会。
([int]([datetime]::ParseExact('%ADate%','%DFormat%',[System‌​.Globalization.Cultu‌​reInfo]::CurrentCult‌​ure)).AddMonths(-1))​.ToString('MM'))"