使用Powershell从名称和日期时间作为文件名的文件中查找Quarter

时间:2017-09-28 04:43:58

标签: powershell batch-file

好的,我是初学者,迷失在这里。

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

样品名称 - > PN-PN-EAST-在GHI-季度 - 例外情况下的DEF水平上的ABC - 2017-07-03-08-02-11.xlsx

PN-PN-EAST-在GHI的DEF水平上的ABC - 月度 - 例外 - 2017-06-02-09-04-14.CSV

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"
)

到此为止它正在按预期工作(寻找月份)

Set "DFormat=ddMMyyyy"

For /F UseBackQ %%A In (
    `Powershell "([datetime]::ParseExact('%ADate%','%DFormat%', [System.Globalization.CultureInfo]::CurrentCulture)).AddMonths(-1).ToString('MMM-yyyy')"`
) Do Set "DateF=%%A"

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

For /F UseBackQ %%A In (
    `Powershell "([datetime]::ParseExact('%ADate%','%DFormat%',[System.Globalization.CultureInfo]::CurrentCulture)).AddQuarter(-1).ToString('M')"`
 ) Do Set "DateF=%%A"

预计 - 2017年第一季度,2017年第二季度等

请不要重复─ Finding current quarter of year in PowerShell to append in a filename with format "yyyyqq"

3 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"

for /D %%d in ("%sourcedir%") do (
 for %%a in ("%%d\*-*-*-*.*") do (SET "FPath=%%~dpa"
  Set "FName=%%~na"
  CALL :process 
 )  
)

GOTO :eof

:process

echo %FPath%/%FName%
::timeout 4

For /F "Tokens=4-9 Delims=-" %%A In ("%Fname%") Do (
 Set "Freq=%%B"
 Set "ADate=%%F%%E%%D"
 SET /a qtr=((100%%E %% 100 - 2^) / 3^) + 1
 IF "%%E"=="01" (SET /a qtr=4&SET /a year=%%F - 1) ELSE (SET /a year=%%F)
)
ECHO Q%qtr%-%year%
ECHO %freq%
ECHO %adate%

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

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

请注意,为每个匹配的文件名执行例程:process。需要在:process例程中执行每个单独文件的任何所需处理 - 您不需要提及所需的处理,因此通过echo语句中的:process语句显示各种提取和处理的元素。例行公事。

提取季度(处理文件的日期前一个月)的额外处理是首先在字符串100之后的一个字符串(我假设你的月元素出现在%%E)中,取结果的mod-100,减去2(原来的2月4月产生0..2,5月到7月产生3..5等);将结果除以3并加1。

1月是一个特例,所以如果月份是1月份,则该季度为4,年份减少1,否则年份(我假设)为%%F

我不知道PS代码是什么问题。

答案 1 :(得分:0)

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

@Echo Off
SetLocal EnableDelayedExpansion
For /D %%A In ("AA\*") Do (For %%B In ("%%A\*-*-*-*-*-*-*-*-*-*-*-*.*") Do (
        For /F "Tokens=5,7-9 Delims=-" %%C In ("%%~nB") Do (Echo %%~fB
            Echo File Path = %%~dpB
            Echo Frequency = %%C
            For /F "UseBackQ Tokens=1-2" %%G In (
                `Powershell "([datetime]::ParseExact('%%D%%E%%F','yyyyMMdd', [System.Globalization.CultureInfo]::CurrentCulture)).AddMonths(-1).ToString('MM yyyy')"`
            ) Do (Set/A "Quart=(1%%G-101)/3+1"
                Echo Expected  = Q!Quart!-%%H)
            Echo=)))
Pause

我假设文件名中的日期信息格式为yyyy-MM-dd,如果yyyy-dd-MM更改yyyyMMdd第8行,则yyyyddMM < / p>

临时编辑

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

@Echo Off
SetLocal EnableDelayedExpansion
For %%G In (01 02 03 04 05 06 07 08 09 10 11 12
) Do (Set/A "Quart=(1%%G-101)/3+1"
    Echo Q!Quart!)
Pause

您可以看到所有十二个月的工作都符合预期,所以请向我解释为什么您认为该剧本无法阅读&#34;!&#34;

答案 2 :(得分:0)

对我之前的实施进行了一些调整,现在它已经工作了几个月..

const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;

console.time("iterate from start and end");
for (let i = 0, k = len - 1; i < len && k >= 0; i++, k--) {
  if (arr[i] === n || arr[k] === n) break;
}
console.timeEnd("iterate from start and end");

了解更多详情 - Q3-2017 logic for October is not working