
using Windows command line, e.g. to find files on disk
ExecuteScriptText
, but the manual says it cannot read results back. Here's a little snippet to do just that. You can use this to find directories in the Windows path variable, or to find files (with wild cards) on a disk drive:•print ExecuteWinCmd("echo hello, world!") hello, world! •print SearchWindowsPath("miktex") C:\Programme\MiKTeX 2.7\miktex\bin; •print FindFilesOnDisk("c", "latex.exe") looking for latex.exe on drive c: - please stand by, this may take a long time! C:\Programme\MiKTeX 2.7\miktex\bin\latex.exe;
Here's the code you need to paste in your Procedure window:
function/S ExecuteWinCmd(command) string command string IPUFpath = SpecialDirPath("Igor Pro User Files",0,1,0) // guaranteed writeable path in IP6 string batchFileName = "ExecuteWinCmd.bat", outputFileName = "ExecuteWinCmd.out" string outputLine, result = "" variable refNum NewPath/O/Q IgorProUserFiles, IPUFpath Open/P=IgorProUserFiles refNum as batchFileName // overwrites previous batchfile fprintf refNum,"cmd/c \"%s > \"%s%s\"\"\r", command, IPUFpath, outputFileName Close refNum ExecuteScriptText/B "\"" + IPUFpath + "\\" + batchFileName + "\"" Open/P=IgorProUserFiles/R refNum as outputFileName do FReadLine refNum, outputLine if( strlen(outputLine) == 0 ) break endif result += outputLine while( 1 ) Close refNum return result end function/S SearchWindowsPath(str) string str return ListMatch(ExecuteWinCmd("path"),"*"+str+"*") end function/S FindFilesOnDisk(driveName, fileName) string driveName, fileName string fileNotFoundString = "_file not found_" // change this to "", if you prefer an empty string // allow user to specify "c" or "C:", or even "" (converted to "C:") as the driveName switch( strlen(driveName) ) case 0: driveName = "c" // fall through case 1: driveName += ":" case 2: break default: Abort "illegal drive specification" endswitch // attrib/s is the fastest way to find a file with a given name (with wild cards) anywhere on a disk // but it can still take a long time, especially with large hard disks! print "looking for "+fileName+" on drive "+driveName+" - please stand by, this may take a long time!" // here we go... this command returns only when Windows has finished with it string found = ExecuteWinCmd("attrib /s "+driveName+"\\"+fileName) // convert line break characters to ";" to make the answer an Igor list found = ReplaceString("\r", found, ";") string str, result = "" variable n, nmax = ItemsInList(found) - 1 // if we get only one item, then it's possible that the file was not found // attrib/s then returns something like "file C:\bla.bla not found" // unfortunately, that message is in the local language of the OS ! if( nmax == 0 ) str = found[0, strsearch(found, driveName, 0, 2) - 1] // if the characters before the file name ... if( strsearch(str, UpperStr(str), 0) < 0 ) // ... contain lower case characters ... return fileNotFoundString // ... we assume the file was not found endif endif // the file was probably found, maybe even more than once // attrib/s then returns something like "A HR C:\jack\data\bla.bla" // the length of the attribute list seems unpredictable, but it's all uppercase for( n = nmax; n >= 0; n -= 1 ) str = StringFromList(n, found) // for each item str = str[strsearch(str, driveName, 0, 2), strlen(str)-1] // excise file path result = AddListItem(str, result) // add to result list endfor return result end
I would be happy about feedback from testers, especially of the
FindFilesOnDisk
routine since it contains some assumptions about international Windows systems (see code documentation).

Forum

Support

Gallery
Igor Pro 10
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More