好的,我是初学者,迷失在这里。
我有一个包含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"
答案 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");