我在位置A有一个超过10,000个excel文件的列表。
我需要一个免费的实用程序(因为我需要使用Windows任务调度程序) 每x分钟运行一次),这将扫描这些文件并搜索 文件中的特定字符串/内容。
也应在特定日期之后创建/修改文件。
如果文件符合这些条件,则必须将其复制到位置B.
我找到了一个名为Ultrafile Search
的免费程序,该程序设法识别文件,但它不运行参数等,所以我不能在调度程序中使用它。我也试过了WinGrep
,它看起来像我需要的那样,但它一直在冻结,可能是由于文件的数量。命令行实用程序或批处理文件脚本会很棒。感谢
答案 0 :(得分:1)
PowerShell
解决方案
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;
};