命令行实用程序,用于根据文件的内容和日期复制文件

时间:2014-07-08 10:50:58

标签: excel batch-file powershell scripting command-line-arguments

我在位置A有一个超过10,000个excel文件的列表。

  • 我需要一个免费的实用程序(因为我需要使用Windows任务调度程序) 每x分钟运行一次),这将扫描这些文件并搜索 文件中的特定字符串/内容。

  • 也应在特定日期之后创建/修改文件。

  • 如果文件符合这些条件,则必须将其复制到位置B.

我找到了一个名为Ultrafile Search的免费程序,该程序设法识别文件,但它不运行参数等,所以我不能在调度程序中使用它。我也试过了WinGrep,它看起来像我需要的那样,但它一直在冻结,可能是由于文件的数量。命令行实用程序或批处理文件脚本会很棒。感谢

2 个答案:

答案 0 :(得分:1)

PowerShell解决方案

  • 以递归方式查找 c:\ temp 下的所有excel文件
  • 检查自2010年1月1日起是否已使用
  • 检查表单1中的单元格A1等于变量str

如果是,则将文件复制到新目录( c:\ test

$newpath = "c:\test"
$str = "Test"
$xl = New-Object -comobject Excel.Application
$xl.visible = $false

$excelSheets = Get-ChildItem c:\temp -recurse -include *.xls*  | where-object {$_.lastwritetime -gt “1/1/2010}

foreach($excelSheet in $excelSheets)
{
$workbook = $xl.Workbooks.Open($excelSheet)
$ws = $workbook.workSheets.Item(1)
$strxl = $ws.Cells.Item(1,1).Value2
$workbook.close()
if ($strxl -eq $str) {Copy-Item $excelsheet $newpath}
}#end foreach
$xl.quit()
$xl = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

答案 1 :(得分:0)

只是一个基本的骨架。根据需要进行调整。

这是一个混合批处理/ jscript文件(另存为.cmd)。它使用robocopy首先选择指定日期范围内的文件。生成的列表被传递到javascript部分以过滤excel文件的内容。 javascript充当过滤器,仅回显内部带有指示字符串的文件名。此列表由for命令检索/处理(在示例中,它只是将文件名回显到控制台)

当然,要使它工作,必须安装excel。

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************
    setlocal enableextensions disabledelayedexpansion

    set "sourceFolder=%cd%"
    set "dateStart=20140709"
    set "searchString=testing"

    set "dateFilter=robocopy "%sourceFolder%" "%temp%" *.xls /l /njh /njs /ndl /nc /ns /maxage:%dateStart% "
    set "contentFilter=cscript //nologo //e:Javascript "%~f0" /search:"%searchString%" "

    for /f "delims=" %%a in (' %dateFilter% ^| %contentFilter% ') do (
        echo Selected file : [%%a]
    )

    endlocal
    exit /b

@end
// **** Javascript zone *****************************************************

    // retrieve the string to search for
    var searchFor = WScript.Arguments.Named('search');

    // instantiate needed components
    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var excel = new ActiveXObject('Excel.Application');

    // iterate over the stdin reading file names to process
    while ( ! WScript.StdIn.AtEndOfStream ){
        var fileName = WScript.StdIn.ReadLine();
        fileName = fileName.replace(/^\s*/g,'');
        fileName = fso.GetAbsolutePathName(fileName);
        if (fso.FileExists( fileName )){
            if (excelDataSearch( excel, fileName, searchFor )) {
                WScript.StdOut.WriteLine( fileName );
            };
        };
    };

    // if not needed, close the instantiated excel application
    if ( excel.WorkBooks.Count === 0 ) excel.Quit();

    // leave
    WScript.Quit(0);


function excelDataSearch( excel, workbook, searchString ){
    var returnValue = false ;

    try {
        // search for workbook application
        //var wb = GetObject( workbook );
        var wb = excel.Workbooks.Open( workbook, false, true );

        // iterate the worksheets of the workbook searching the string in its data
        var eWS = new Enumerator(wb.WorkSheets);
        for (; !eWS.atEnd() ; eWS.moveNext()){
            var ws = eWS.item();
            if ( ws.UsedRange.Cells.Find(searchString) ){
                returnValue = true ;
                break;
            };
        };

        // close workbook
        wb.Close( false );

    } catch(e){
            // some kind of problem with objects
            // WScript.Echo( e.description );
    };

    return returnValue;
};