Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅列出Windows中每个月的最新文件_Windows_Powershell_Batch File_Sas - Fatal编程技术网

仅列出Windows中每个月的最新文件

仅列出Windows中每个月的最新文件,windows,powershell,batch-file,sas,Windows,Powershell,Batch File,Sas,我试图找到一种方法来解析数百个XLS文件;它们包含月度报告并存储在子目录中。在某些情况下,由于初始XLS文件中的错误,一个月内会有多份报告,这些错误后来被更正。我在windows环境中工作。 我需要在SAS中导入这些文件以进行分析;除了SAS和基本windows shell(可能是powershell),我不能使用任何其他工具 文件名包含有关生成日期的信息,因此我只能从名称中识别重新运行。目录内容的示例如下: rep1_02012016.xls rep1_02112016.xls #this w

我试图找到一种方法来解析数百个XLS文件;它们包含月度报告并存储在子目录中。在某些情况下,由于初始XLS文件中的错误,一个月内会有多份报告,这些错误后来被更正。我在windows环境中工作。 我需要在SAS中导入这些文件以进行分析;除了SAS和基本windows shell(可能是powershell),我不能使用任何其他工具

文件名包含有关生成日期的信息,因此我只能从名称中识别重新运行。目录内容的示例如下:

rep1_02012016.xls
rep1_02112016.xls #this would be a rerun on feb 11 if feb 1's report contains an error
rep1_03012016.xls
rep1_04012016.xls
我的想法是通过管道将shell命令的输出传输到SAS,以便知道要读取哪些文件。我找不到一种方法来获取每个月的单个文件,每个月都过滤所有文件,但最近的文件除外。所以我会在二月,三月,四月,等等。 欢迎使用任何指针。

类似(未经测试):

这应该很接近,不过请注意,它对文件名的格式做了很多假设-例如,您可能希望在下划线上拆分文件名。

类似(未测试):


这应该非常接近,不过请注意,它对文件名的格式做了很多假设-例如,您可能希望在下划线上拆分文件名。

您可以使用powershell执行此操作,这假设您的报告是统一命名的,因为使用文件名来确定带有子字符串的日期:

$files = Get-ChildItem .\path\to\dir
$months = @("01","02","03","04","05","06","07","08","09","10","11","12")

$output = @()

foreach ($m in $months) {
  $f = $files.name | Where-Object { $_.substring(5,2) -eq $m }
  if ($f.count -gt 1) {
    $f = ($f | Sort-Object -Descending)[0]
  }
  $output += $f
}

Write-Host $output

您可以使用powershell执行此操作,这假定您的报告以统一的名称命名,因为文件名用于使用子字符串确定日期:

$files = Get-ChildItem .\path\to\dir
$months = @("01","02","03","04","05","06","07","08","09","10","11","12")

$output = @()

foreach ($m in $months) {
  $f = $files.name | Where-Object { $_.substring(5,2) -eq $m }
  if ($f.count -gt 1) {
    $f = ($f | Sort-Object -Descending)[0]
  }
  $output += $f
}

Write-Host $output

对于批处理文件版本

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem配置源文件夹
设置“rootPath=x:\某处”
rem,如果可以访问源文件夹
pushd“%rootPath%”和(
rem准备一个临时文件引用
对于%%t in(“%temp%\%random%%random%%random%%random%%random%%random%.tmp”)执行以下操作(
rem按相反的名称顺序准备文件列表
>“%%~ft”((对于/r.“%%a in(rep1_*.xls)do@echo(%%~na%%~fa)| sort/r)
rem每月检索列表中的第一个文件
对于%%m in(
01 02 03 04 05 06 07 08 09 10 11 12
)是否为/f“令牌=1,*”%%a在('
findstr/i“rep1@m”“%%~ft”^ cmd/e/v/c“set/p=&(echo(!)”
“)如果不是“%%~b”==”(回显(%%b)
删除临时文件
)&del/q“%%~ft”
rem返回上一个active directory
邻苯二胺
)

用于批处理文件版本

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem配置源文件夹
设置“rootPath=x:\某处”
rem,如果可以访问源文件夹
pushd“%rootPath%”和(
rem准备一个临时文件引用
对于%%t in(“%temp%\%random%%random%%random%%random%%random%%random%.tmp”)执行以下操作(
rem按相反的名称顺序准备文件列表
>“%%~ft”((对于/r.“%%a in(rep1_*.xls)do@echo(%%~na%%~fa)| sort/r)
rem每月检索列表中的第一个文件
对于%%m in(
01 02 03 04 05 06 07 08 09 10 11 12
)是否为/f“令牌=1,*”%%a在('
findstr/i“rep1@m”“%%~ft”^ cmd/e/v/c“set/p=&(echo(!)”
“)如果不是“%%~b”==”(回显(%%b)
删除临时文件
)&del/q“%%~ft”
rem返回上一个active directory
邻苯二胺
)
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
设置“sourcedir=U:\sourcedir”
::删除以$开头的不应该存在的变量-确保
对于($)中的%%b执行/F“delims=”%%a执行('set%%b2^>Nul')执行设置“%%a=”
::为文件存在的每个日期设置$yyyymm50 dd。
对于/f“tokens=2delims=389;”。%%a IN(
'dir/b/a-d“%sourcedir%\rep1.*.xls”'
)做(
设置“性别=%%a”
SET/a gendate=!gendate:~-4!!gendate:~0,2!50-1!gendate:~2,2!+100
设置“$!gendate!=%%a”
)
::现在按YYMM的日期顺序读取每一组$value,与dd相反
设置prevdate=0
对于('set$')中的/f“tokens=1,2 delims=$=”%%a,请执行以下操作(
集合/a性别=%%a
如果“!prevdate!!neq”!性别:~0,6!”(
SET/a prevdate=%%a/100
ECHO rep1_uU1%%b.xls
)
)
后藤:EOF
您需要更改
sourcedir
的设置以适应您的环境

第一步是从文件名中获取日期部分,将其限制为yyyymmXX,其中XX=50-dd。这是通过插入一个常数
50
,加上100,减去与日数串在一起的
1
,以
0
(如
08
)开始的字符串是八进制而不是十进制来实现的

结果是,该月日期较晚的$variable在“dd”位置上的数字将小于该月较早的数字,因此在
集合
列表中列在较早的位置。然后从文件名中为
$number
分配原始日期字符串

然后只需检测$vars的
集合
列表中的$yyyymm何时发生变化。一旦该字符串发生变化,就会检测到一个新的月份,并且可以重建文件名。这还可以通过方便地将
gendate
的最后2位除以100来设置一个新的
prevdate

Nul')执行设置“%%a=”
::为文件存在的每个日期设置$yyyymm50 dd。
对于/f“tokens=2delims=389;”。%%a IN(
'dir/b/a-d“%sourcedir%\rep1.*.xls”'
)做(
设置“性别=%%a”
SET/a gendate=!gendate:~-4!!gendate:~0,2!50-1!gendate:~2,2!+100
设置“$!gendate!=%%a”
)
::现在以YYMM,r的日期顺序读取每组$value
@echo off
setlocal EnableDelayedExpansion

rem Process the files, store the last one of each month in "file" array
for /F "tokens=1* delims=_" %%a in ('dir /B *.xls') do (
   set "fdate=%%b"
   set "file[!fdate:~0,2!]=%%a_%%b"
)

rem Show the result
for /F "tokens=2 delims==" %%a in ('set file[') do echo %%a