Immediate Solutions


Working with the File System

Files and folders are the building blocks of any system. They contain the data we treasure , the operating system we use, and the applications we work with. Shell scripting, KiXtart, and Windows Script Host provide many ways of working with the file system. Although the tasks these scripting methods perform are similar, the commands, syntax, and limitations of each method differ .

Manipulating the File System Using Shell Scripting

Shell scripting provides limited functionality for manipulating the file system. Although Resource Kit utilities extend the capabilities of shell scripting, it still cannot compare to the more powerful functions of KiXtart and Windows Script Host. So, why use shell scripting? Shell scripting comes built into every operating system, and you will run into situations where shell scripting is your only alternative.

Deleting Files Depending on Extension

The Windows 2000/XP DELETE command supports many options that the Windows 9 x command does not. To remove files based on extension in Windows 2000/XP, start the command prompt and enter the following:

 DEL *.  ext  /F /Q /S 

Here, ext is the file extension of the files to delete; the /F switch forces the deletion of read-only files; the /Q switch removes prompts; and the /S switch performs deletions not only in the current directory, but in the subdirectories as well.

Deleting Folders and Subfolders

Windows XP includes the RMDIR (Remove Directory) command that mimics the Windows 9 x DELTREE.EXE (Delete Tree) command. To delete a root folder and all its subfolders with RMDIR, start the command prompt and enter the following:

 RMDIR /Q /S  directory  

Here, directory is the name of the directory to delete; the /Q switch removes prompts; and the /S switch performs the deletion of all files and subdirectories.

Determining File Versions

FILEVER.EXE is a Resource Kit utility to display file versions from the command line. To determine a file version, start the command prompt and enter the following:

 FILEVER  filename  

Here, filename is the path and name of file to determine the file version.

Note  

Remember, only application files have versions.

Updating Program Files Depending on the Version

REPLACE is a command that can be used to update older files with newer file versions. To update a file with a newer version, start the command prompt and enter the following:

 REPLACE /R /S /U  source destination  

Here, source is the path and name of the source file; destination is the directory to start the replacement; the /R switch allows for readonly file replacement; the /S switch performs the replacement in the current directory and all subdirectories; and the /U switch specifies to only replace files with a newer version.

Replicating Files and Directories

You can tell users to back up their files to the server, but whether the users actually do back the files up is a different story. ROBOCOPY is a Resource Kit utility to copy, move, or replicate files from the command line. To replicate files, start the command prompt and enter the following:

 ROBOCOPY /MIR /ETA /NP /LOG+:  logfile source destination  

Here, the /MIR mirrors a directory tree; the /ETA switch displays the estimated time of arrival of copied files; the /NP switch causes no copy progress to be displayed; the /LOG+: logfile outputs the status to the logfile ; and destination is the location to replicate the source to.

Displaying File or Folder Attributes

The ATTRIB command allows you to display file or folder attributes. To display the attributes of a file or folder, start the command prompt and enter the following:

 ATTRIB  filefolder  

Here, filefolder is the file or folder that contains the attributes you wish to display.

Setting/Removing File or Folder Attributes

The ATTRIB command allows you to set or remove file and folder attributes. To set attributes of a file or folder, start a command prompt and enter the following:

 ATTRIB +R +H +S  filefolder  
Tip  

Here, filefolder is the file or folder that contains the attributes you want to set. The + R , + H , and + S set filefolder 's Read Only, Hidden, and System attributes respectively.

To remove attributes of a file or folder, start a command prompt and enter the following:

 ATTRIB -R -H -S  filefolder  

Appending Text Files

Collecting information from log files can be a time-consuming task. Often, these files are properly formatted but simply need to be collected to a central file. To append the contents of one text file to another, start the command prompt and enter the following:

 TYPE  file1  >>  file2  

Here, file1 is the file whose contents you want to append to file2 .

Compressing Files and Folders

With Windows NT/2000/XP/2003 and a drive formatted with NTFS (New Technologies File System), you can take advantage of NTFS compression to save disk space by compressing your files and folders. The COMPACT command allows you to compress/uncompress NTFS files and folders from the command line. To compress all the files and subfolders of a folder, start a command prompt and enter the following:

 COMPACT /c /s  rootfolder  \*.* 

Here, rootfolder is the folder that contains the files and folders you want to compress. The /c option sets the intended action to compress, and /s specifies that the intended action should be applied to all files and subfolders of the rootfolder .

Manipulating the File System Using KiXtart

KiXtart is a scripting language I introduced in Chapter 1 that is best used when you know the exact file or directory you want to manipulate. KiXtart provides poor directory parsing capabilities with its limited DIR command and lack of recursive support. To compensate, you can call external commands for indirect file management and KiXtart commands for direct file management.

Using External Commands

KiXtart provides two statements to run an external 16- or 32-bit application or command: SHELL and RUN . The SHELL statement will wait for the external command to complete, but the RUN statement will not. Both the SHELL and RUN statements have the same syntax:

  statement  "  command  " 

Here, statement is the RUN or SHELL statement, and command is the command to run. To delete all the files in the temp directory using the RUN statement, you would enter:

 RUN "  %COMSPEC%  /C DEL C:\TEMP\*.* /F /Q /S" 
Note  

%COMSPEC% /C is used to run commands from the DOS environment.

Renaming a File or Folder

KiXtart does not contain a function to rename a file or folder. Instead, you can move the current item to a new item with the desired name, providing an item with the new name does not already exist. To rename a file or folder, proceed as follows :

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart from http://www.kixtart.org to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and the file name of a script file that contains the following:

 REN( '  oldname  ', '  newname  ' ) Function REN( $OldFileName, $NewFileName )   MOVE $OldFileName $NewfileName /h EndFunction 

Here, oldname is the name of the file or folder to rename and newname is the name to rename the oldname to. The REN function uses the MOVE command to rename the file or folder. The /h option specifies to include system and hidden files.

Displaying File or Folder Attributes

The KiXtart command GetFileAttr allows you to display file or folder attributes. To display the attributes of a file or folder, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart, from http://www.kixtart.org, to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and file name of a script file that contains the following:

 DisplayAttr('  path  ) Sleep 5 Function DisplayAttr($FileFolder)   $ReadOnly = 0     $Hidden = 0     $System = 0   $Dir = 0          $Archive = 0    $Encrypt = 0   $Normal = 0       $Temp = 0       $Sparse = 0   $Reparse = 0      $Compress = 0   $Offline = 0   If GetFileAttr($FileFolder) & 1 $ReadOnly = 1 EndIf   If GetFileAttr($FileFolder) & 2 $Hidden = 1 EndIf   If GetFileAttr($FileFolder) & 4 $System = 1 EndIf   If GetFileAttr($FileFolder) & 16 $Dir = 1 EndIf   If GetFileAttr($FileFolder) & 32 $Archive = 1 EndIf   If GetFileAttr($FileFolder) & 64 $Encrypt = 1 EndIf   If GetFileAttr($FileFolder) & 128 $Normal = 1 EndIf   If GetFileAttr($FileFolder) & 256 $Temp = 1 EndIf   If GetFileAttr($FileFolder) & 512 $Sparse = 1 EndIf   If GetFileAttr($FileFolder) & 1024 $Reparse = 1 EndIf   If GetFileAttr($FileFolder) & 2046 $Compress = 1 EndIf   If GetFileAttr($FileFolder) & 4096 $Offline = 1 EndIf   ? "File: " + $FileFolder   ? ""   ? "ReadOnly: " + $ReadOnly   ? "Hidden: " + $Hidden   ? "System: " + $System   ? "Directory: " + $Dir   ? "Archive: " + $Archive   ? "Encrypted: " + $Encrypt   ? "Normal: " + $Normal   ? "Temporary: " + $Temp   ? "Sparse: " + $Sparse   ? "Reparse: " + $Reparse   ? "Compressed: " + $Compress   ? "Offline: " + $Offline EndFunction 

Here, path is the file or folder that contains the attributes you wish to display.

Note  

Windows 2000 adds several new file attributes with NTFS 5. For more information, see Chapter 17 of the Windows 2000 Professional Resource Kit.

Setting File or Folder Attributes

The KiXtart command SetFileAttr allows you to set file or folder attributes. To modify the attributes of a file or folder, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart, from http://www.kixtart.org, to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and file name of a script file that contains the following:

 ;Sets Read Only and Hidden attributes SetAttribs('  filefolder  ',1,1,0,0,0,0) Function SetAttribs($File, $ReadOnly, $Hidden, $System, $Archive,    $Temp, $Offline) $Rcode = SetFileAttr($File,128) ;Reset file to normal   $Attribs = 0   If $ReadOnly = 1 $Attribs = $Attribs + 1 EndIf   If $Hidden = 1 $Attribs = $Attribs + 2 EndIf   If $System = 1 $Attribs = $Attribs + 4 EndIf   If $Archive = 1 $Attribs = $Attribs + 32 EndIf   If $Temp = 1 $Attribs = $Attribs + 256 EndIf   If $Offline = 1 $Attribs = $Attribs + 4096 EndIf   $SetAttribs = SetFileAttr($File,$Attribs) EndFunction 

Here, filefolder is the file or folder that contains the attributes you want to set. To modify filefolder 's attributes, change the value of the corresponding input parameters ( $ReadOnly , $Hidden , $System , $Archive , $Normal , $Offline ) to 1 to enable, or 0 to disable.

Appending Text Files

To append the contents of one text file to another, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart, from http://www.kixtart.org, to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and file name of a script file that contains the following:

  $File1  = "  file1  "  $File2  = "  file2  "  $Rcode  = Open(1,  $File1  )  $Rcode  = Open(2,  $File2  ,5)  $File1  = ReadLine(1) While @Error=0   If  $File1   $Rcode  = WriteLine(2,  $File1  + Chr(13) + Chr(10))   EndIf  $File1  = ReadLine(1) Loop  $Rcode  = Close(1)  $Rcode  = Close(2) 

Here, file1 is the file whose contents you want to append to file2 .

Searching and Replacing Lines within Files

Replacing specific lines within text files is a common administrative task. To search and replace a line within a text file, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart, from http://www.kixtart.org, to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and file name of a script file that contains the following:

  $File  = "  somefile  "  $DLine  = '  searchline  '  $RLine  = '  replaceline  '  $TempFile  =  $File  + ".TMP"  $LineNum  = 0  $Rcode  = OPEN (1,  $File  , 2) DEL  $TempFile $Rcode  = OPEN (2,  $TempFile  , 5)  $Line  = READLINE(1) WHILE @Error = 0  $LineNum  =  $LineNum  + 1   IF  $Line  =  $DLine   $Rcode  = WRITELINE(2,  $RLine  + Chr(13) + Chr(10))   ELSE  $Rcode  = WRITELINE(2,  $Line  + Chr(13) + Chr(10))   ENDIF  $Line  = READLINE(1) LOOP  $Rcode  = CLOSE(1)  $Rcode  = CLOSE(2) COPY  $TempFile $File  DEL  $TempFile  

Here, somefile is the file to parse, and replaceline is the text to replace the searchline with.

Searching and Replacing within an INI File

INI files, or initialization files, are text files that were originally created to store configuration information for 16-bit applications. KiXtart is the easiest scripting method for modifying an INI file because it has two built-in INI functions ( READPROFILESTRING and WRITE PROFILESTRING ). To search and replace a value in an INI file, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and extract the latest version of KiXtart, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "kix32 scriptfile. "

Here, scriptfile is the full path of the new directory from step 1 and file name of a script file that contains the following:

  $LoadKey  = ReadProfileString("  inifile"  ,  section  ,  key  ) If  $LoadKey  =  oldvalue  WriteProfileString("  inifile  ",  section  ,  key  ,  newvalue  ) EndIf 

Here, inifile is the complete name and path of the INI file; section is the name of the INI section to search (without the brackets); key is the name of the key to search; oldvalue is the value to find; and newvalue is the value to replace it with.

Note  

WriteProfileString in this example replaces the old value with a new value surrounded by double quotes. If you wish to clear the value, the new value should be a space surrounded by double quotes. Simply supplying double quotes (no space) would delete the entire key and value from the INI file.

Manipulating the File System Using Windows Script Host

Many of the file management tasks administrators would like to script are too complex or cannot be done with shell scripting or KiXtart. Through the FileSystemObject object, Windows Script Host (WSH) provides direct access to the file system, allowing you to create complex and unique file management scripts.

Accessing the FileSystemObject Object

The FileSystemObject object stores all the functions that allow you to manipulate the file system through a script file. To create an instance of the FileSystemObject , proceed as follows:

 Set  FSO  = CreateObject("Scripting.FileSystemObject") 

Going through Subfolders

This subroutine will work through the subfolders of a main directory, calling another subroutine called MainSub :

 Sub GoSubFolders (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     MainSub  objDIR  For Each  eFolder  in  objDIR  .SubFolders       GoSubFolders  eFolder  Next   End If End Sub 
Note  

The System Volume Information Directory is a system directory that stores system files, restores information, and encryption logs. Since this is an exclusive system directory, scripts that attempt to access it will generate an access denied error.

Connecting to a File

Before performing certain WSH actions on a file, you must first connect to it using the GetFile method. Here is a function to connect to a file:

 Function GetFile(  sFILE  )   On Error Resume Next   Set  GetFile  =  FSO  .GetFile(  sFILE  )      If Err.Number <> 0 Then     Wscript.Echo "Error connecting to: " &  sFILE  & VBlf & _     "[" & Err.Number & "] " & Err.Description     Wscript.Quit Err.Number   End If End Function 
Tip  

On Error Resume Next allows the script to continue to the next statement if an error occurs. This allows you to perform error checking and alerting.

In this script, a connection to a file is attempted, and the user is prompted if any errors occur.

Connecting to a Folder

Before performing certain WSH actions on a folder, you must first connect to it using the GetFolder method. Here is a function to connect to a folder:

 Function GetFolder(  sFOLDER  )   On Error Resume Next   Set  GetFolder  =  FSO  .GetFolder(  sFOLDER  )   If Err.Number <> 0 Then     Wscript.Echo "Error connecting to folder: " & sFOLDER & _        VBlf & "[" & Err.Number & "] " & Err.Description     Wscript.Quit Err.Number   End If End Function 

Generating a Random File Name

Most applications use temporary files ”files with random and or unique names . During your scripting lifetime, you will need to generate a random filename to hold temporary data. Here is a function to create a temporary file name:

 Function GetRandomName()   Set  FSO  = CreateObject("Scripting.FileSystemObject")   GetRandomName =  FSO  .GetTempName End Function 

Generating a Directory Listing

To generate a directory list, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  " Set  objDIR  = GetFolder(sDIR) GoSubFolders  objDIR  Sub ListFiles (  objDIR  )     For Each  efile  in  objDIR  .Files       Wscript.Echo  efile  Next End Sub Sub GoSubFolders (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     ListFiles  objDIR  For Each  eFolder  in  objDIR  .SubFolders       Wscript.Echo  eFolder  GoSubFolders  eFolder  Next   End If End Sub 

Here, directory is the root folder containing the files and folders to list. The subprocedure ListFiles rotates through all the files within the current directory and lists their names.

Note  

You need to append the GetFolder routine, listed earlier in this chapter, to this script in order for it to run.

Tip  

If you want to send the directory list to a text file, you can use the DOS append command ( >> ) when running the script from the command line (for example, cscript scriptfile.vbs >> textfile .txt ).

Deleting a File

To delete a file with WSH, you can use the DeleteFile method. Here is a subroutine to delete a file:

 Sub DelFile(  sFILE  )   On Error Resume Next  FSO  .DeleteFile  sFILE  , True   If Err.Number <> 0 Then     Wscript.Echo "Error deleting file: " &  sFILE  End If End Sub 

In this script, a file deletion is attempted, and the user is prompted if any errors occur.

Deleting All Files within a Folder

To delete all files within a root folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  " Set  objDIR  = GetFolder(sDIR) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     DelFile  efile  Next End Sub 

Here, directory is the root folder containing the files to delete.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Files Depending on Size

It happens to all of us, but every now and then a user chooses to upload hundred meg files to a public share. To delete all files within a root folder and its subfolders depending on size, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  lSIZE  =  lowersize uSIZE  =  uppersize  Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     If  lSIZE  = Null and  uSIZE  = Null Then       If  efile  .Size = 0 Then         DelFile  efile  End If     ElseIf  lSIZE  <> Null and  uSIZE  = Null Then       If  efile  .Size <  lSIZE  Then         DelFile  efile  End If     ElseIf  lSIZE  = Null and  uSIZE  <> "" Then       If  efile  .Size >  uSIZE  Then         DelFile  efile  End If     ElseIf  lSIZE  =  uSIZE  Then       If  efile  .Size =  lSIZE  Then         DelFile  efile  End If     Else       If  efile  .Size >  lSIZE  and _  efile  .Size <  uSIZE  Then         DelFile  efile  End If     End If   Next End Sub 

Here, directory is the folder containing the files to delete, lowersize is the lower size limit, and uppersize is the upper size limit. If both limits are null, the script will delete all empty files. If just the upper limit is null, the script will delete files smaller than the lower limit. If just the lower limit is null, the script will delete files larger than the upper limit. If both limits are not null but equal, the script will delete files equal to the limit. If both limits are not null and not equal, the script will delete files within the two limits.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Files Depending on Date

A common administrative task is deleting old files from public shares. To delete all files within a root folder and its subfolders depending on last modified date, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  lDATE  = "  lowerdate  "  uDATE  = "  upperdate  "  lDATE  = CDate(  lDATE  )  uDATE  = CDate(  uDATE  ) Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     If  lDATE  = Null and  uDATE  = Null Then       If  efile  .DateLastModified = Date Then         DelFile  efile  End If     ElseIf  lDATE  <> Null and  uDATE  = Null Then       If  efile  .DateLastModified <  lDATE  Then         DelFile  efile  End If     ElseIf  lDATE  = Null and  uDATE  <> Null Then       If  efile  .DateLastModified >  uDATE  Then         DelFile  efile  End If     ElseIf  lDATE  =  uDATE  Then       If  efile  .DateLastModified =  lDATE  Then         DelFile  efile  End If     Else       If  efile  .DateLastModified >  lDATE  and _  efile  .DateLastModified <  uDATE  Then         DelFile  efile  End If     End If   Next End Sub 

Here, directory is the folder containing the files to delete, lowerdate is the lower date limit, and upperdate is the upper date limit. If both limits are null, the script will delete files last modified today. If just the upper limit is null, the script will delete files smaller than the lower limit. If just the lower limit is null, the script will delete files larger than the upper limit. If both limits are not null but equal, the script will delete files equal to the limit. If both limits are not null and not equal, the script will delete files within the two limits.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Files Depending on Name

From hacker tools to new viruses, deleting files with a specific name is a common administrative task. To delete all files with a specific name within a root folder and its subfolders, proceed according to the steps on the next page.

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  sFILE  = "  filename  " Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     If LCase(  efile  .Name) = LCase(  sFILE  ) Then       DelFile  efile  End If   Next End Sub 

Here, directory is the folder containing the files to delete, and filename is the name of the file to search for.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Files Depending on Extension

Cleaning a system of specific file types, such as TMP (Temporary), MP3 (Motion Picture Experts Group Layer 3 Audio), AVI (Audio Video Interleave), and other file types, is a very common administrative task. To delete all files with a specific extension within a root folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  sEXT  = "  EXT  " Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     fEXT =  FSO  .GetExtensionName(  efile  .Path)     If LCase(  fEXT  ) = LCase(  sEXT  ) Then       DelFile  efile  End If   Next End Sub 

Here, directory is the folder containing the files to delete, and EXT is the file extension to search for. The sub procedure MainSub rotates through every file within the current directory, checks the file extension, and deletes the file if specified.

Note  

You need to append the GoSubFolders, DelFile, and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting a Folder

To delete a folder with WSH, you can use the DeleteFolder method. Here is a subroutine to delete a folder:

 Sub DelFolder(  sFOLDER  )   On Error Resume Next  FSO  .DeleteFolder  sFOLDER  , True   If Err.Number <> 0 Then     Wscript.Echo "Error deleting folder: " &  sFOLDER  End If End Sub 
Deleting All Subfolders

To delete all subfolders within a directory, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  " Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub GoSubFolders (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     For Each  eFolder  in  objDIR  .SubFolders       DelFolder  eFolder  Next   End If End Sub 

Here, directory is the folder containing the subfolders to delete.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Folders Depending on Size

By maintaining public shares, you get to notice all the bad habits of a typical user. One of these habits includes leaving empty folders spread throughout the public share. To delete all folders depending on size within a root folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  lSIZE  =  lowersize uSIZE  =  uppersize  Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     For Each  eFolder  in  objDIR  .SubFolders       If  lSIZE  = Null and  uSIZE  = Null Then         If  efolder  .Size = 0 Then           DelFolder  efolder  End If       ElseIf  lSIZE  <> Null and  uSIZE  = Null Then         If  efolder  .Size <  lSIZE  Then           DelFolder  efolder  End If       ElseIf  lSIZE  = Null and  uSIZE  <> Null Then         If  efolder  .Size >  uSIZE  Then           DelFolder  efolder  End If       ElseIf  lSIZE  =  uSIZE  Then         If  efolder  .Size =  lSIZE  Then           DelFolder  efolder  End If       Else         If  efolder  .Size >  lSIZE  and _  efolder  .Size <  uSIZE  Then           DelFolder  efolder  End If       End If     Next   End If End Sub 

Here, directory is the root folder containing the subfolders to delete, lowersize is the lower size limit, and uppersize is the upper size limit. If both limits are null, the script will delete all subfolders with a size of 0. If just the upper limit is null, the script will delete subfolders smaller than the lower limit. If just the lower limit is null, the script will delete subfolders larger than the upper limit. If both limits are not null but equal, the script will delete subfolders equal to the limit. If both limits are not empty and not null, the script will delete subfolders within the two limits.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Folders Depending on Date

If you let them, users will leave files and folders forever on a public share. To delete all folders depending on last modified date within a root folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  lDATE  = "  lowerdate  "  uDATE  = "  upperdate  "  lDATE  = CDate(  lDATE  )  uDATE  = CDate(  uDATE  ) Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     For Each  eFolder  in  objDIR  .SubFolders       If  lDATE  = Null and  uDATE  = Null Then         If  efolder  .DateLastModified = 0 Then           DelFolder  efolder  End If       ElseIf  lDATE  <> Null and  uDATE  = Null Then         If  efolder  .DateLastModified <  lDATE  Then           DelFolder  efolder  End If       ElseIf  lDATE  = Null and  uDATE  <> Null Then         If  efolder  .DateLastModified >  uDATE  Then           DelFolder  efolder  End If       ElseIf  lDATE  =  uDATE  Then         If  efolder  .DateLastModified =  lDATE  Then           DelFolder  efolder  End If       Else         If  efolder  .DateLastModified >  lDATE  and _  efolder  .DateLastModified <  uDATE  Then           DelFolder  efolder  End If       End If     Next   End If End Sub 

Here, directory is the root folder containing the subfolders to delete, lowerdate is the lower date limit, and upperdate is the upper date limit. If both limits are null, the script will delete subfolders last modified today. If just the upper limit is null, the script will delete subfolders smaller than the lower limit. If just the lower limit is null, the script will delete subfolders larger than the upper limit. If both limits are not null but equal, the script will delete subfolders equal to the limit. If both limits are not null and not equal, the script will delete subfolders within the two limits.

Note  

You need to append the GoSubFolders , DelFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Deleting Folders Depending on Name

Any user public folder called GAMES or QUAKE is most likely not work- related , unless you have a better job than I do. To delete all folders with a specific name within a root folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  sFOLDER  = "  foldername  " Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   If  objDIR  <> "\System Volume Information" Then     For Each  eFolder  in  objDIR  .SubFolders       If  LCase  (eFolder.Name) =  LCase  (  sFOLDER  ) Then         DelFolder  efolder  End If     Next   End If End Sub 
Note  

You need to append the GoSubFolders and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Copying a File

To copy a file with WSH, you can use the CopyFile method. Here is a subroutine to copy a file:

 Sub CopyFile(  sFILE  ,  sDIR  )   If Right(  sDIR  ,1) <> "\" Then  sDIR  =  sDIR  & "\"   On Error Resume Next  FSO  .CopyFile  sFILE  ,  sDIR  , True   If Err.Number <> 0 Then     Wscript.Echo "Error copying file: " &  sFILE  End If End Sub 

Here, sFILE is the file to copy, and sDIR is the location to copy the file to.

Copying a Folder

To copy a folder with WSH, you can use the CopyFolder method. Here is a subroutine to copy a folder:

 Sub CopyFolder(  sFOLDER  ,  sDIR  )   If Right(  sFOLDER  ,1) = "\" Then  sFOLDER  = Left(  sFOLDER  ,(Len(  sFOLDER  )-1))   End If   If Right(  sDIR  ,1) <> "\" Then  sDIR  =  sDIR  & "\"   On Error Resume Next  FSO  .CopyFolder  sFOLDER  ,  sDIR  , True   If Err.Number <> 0 Then     Wscript.Echo "Error copying folder: " &  sFOLDER  End If End Sub 

Here, sFOLDER is the folder to copy, and sDIR is the location to copy the folder to.

Moving a File

To move a file with WSH, you can use the MoveFile method. Here is a subroutine to move a file:

 Sub MoveFile(  sFILE  ,  sDIR  )   On Error Resume Next  FSO  .MoveFile  sFILE  , sDIR   If Err.Number <> 0 Then     Wscript.Echo "Error moving file: " &  sFILE  End If End Sub 

Here, sFILE is the file to move, and sDIR is the location to move the file to.

Moving Files with Specific Extensions to a Central Directory

Although certain file types, such as MP3s, do not belong in the public share, you may want to keep them for your own purposes. To move files with a specific extension to a central directory, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sEXT  = "  extension  "  sDIR  = "  startdir  "  sNEW  = "  enddir  " Set  objDIR  = GetFolder(sDIR) GoSubFolders  objDIR  Sub MainSub (  objDIR  )     For Each  efile  in objDIR.Files       fNAME =  efile  fEXT =  FSO  .GetExtensionName(  efile  .Path)       If  LCase  (  fEXT  ) = LCase(  sEXT  ) Then  sEXIST  =  sNEW  &  efile  .Name        If ((  FSO  .FileExists(  sEXIST  )) AND _       (  efile  <>  sEXIST  )) Then           DelFile  sEXIST  End If         On Error Resume Next         MoveFile  efile  , sNEW       End If     Next End Sub 

Here, extension is the name of the extension to search for, startdir is the name of the directory to start the search, and enddir is the directory to store all files.

Note  

You need to append the GoSubFolders , DelFile , MoveFile , and GetFolder routines, listed earlier in this chapter, to this script in order for it to run.

Moving a Folder

To move a folder with WSH, you can use the MoveFolder method. Here is a subroutine to move a folder:

 Sub MoveFolder(  sFOLDER  ,  sDIR  )   If Right(  sFOLDER  ,1) = "\" Then  sFOLDER  = Left(  sFOLDER  ,(Len(  sFOLDER  )-1))   End If   If Right(  sDIR  ,1) <> "\" Then  sDIR  =  sDIR  & "\"   On Error Resume Next  FSO  .MoveFolder  sFOLDER  ,  sDIR  If Err.Number <> 0 Then     Wscript.Echo "Error moving folder: " &  sFOLDER  End If End Sub 

Here, sFOLDER is the folder to move, and sDIR is the location to move the folder to.

Renaming a File

To rename a file, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 MoveFile "  filename  ", "  newname  " 

Here, filename is the name of the file to rename, and sname is the name to rename the file.

Note  

You need to append the MoveFile routine, listed earlier in this chapter, to this script in order for it to run.

Renaming Specific File Extensions

I don't know what planet of bad habits this came from, but some users like to name files with their own personal extensions. Although this might be beneficial to them when searching for their files, it becomes an administrator's nightmare when these files are being shared. Unfortunately, the DOS RENAME command does not have the ability to act through subdirectories. To rename files with specific extensions with a new extension, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sEXT  = "  oldext  "  sNEW  = "  newext  "  sDIR  = "  directory  " Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files  fEXT  =  FSO  .GetExtensionName(  efile  .Path)     If LCase(  fEXT  ) = LCase(  sEXT  ) Then  fNAME  =Left(  efile  .name,(Len(  efile  .Name)-Len(  fEXT  )))+sNEW  efile  .name =  fNAME  End If   Next End Sub 

Here, oldext is the name of the extension to search for, newext is the name of the extension to replace with, and directory is the name of the directory to start the search.

Note  

You need to append the GetFolder and GoSubFolders routines, listed earlier in this chapter, to this script in order for it to run.

Renaming Files with Short File Names

To rename a file with its short DOS 8.3 name, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

  sFILE  = "  filename  " Set  gFILE  = GetFile  sFILE  ShortName =  gFILE  .shortname  MoveFile sFile,  ShortName 

Here, filename is the name of the file to rename. An important thing to know is that you can't rename a file from a long file name to its short name directly because Windows sees long and short file names collectively, and you can't name a file the same name as another file in the current directory. In this example, we first append an SN to the file name and then change the file name to its short name.

Note  

You need to append the GetFile and MoveFile routines, listed earlier in this chapter, to this script in order for it to run.

Related solution:

Found on page:

Using SCANDSKW.EXE to Convert Long File Names to Short

90

Updating Program Files Depending on the Version

To update a program file with a newer version, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  sFILE  = "  filename  " Set  nFILE  = GetFile(  sFILE  ) Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files  fVER  =  FSO  .GetFileVersion(  efile  )  nVER  =  FSO  .GetFileVersion(  sFILE  )     If  LCase  (  efile  .Name) =  LCase  (nFILE.Name) Then       If  fVER  =  nVER  Then         CopyFile  nFILE  ,  efile  .ParentFolder       End If     End If   Next End Sub 

Here, directory is the folder containing the files to update, and filename is the file used to update the older file versions.

Note  

You need to append the GetFile , GetFolder , GoSubFolders , and CopyFile routines, listed earlier in this chapter, to this script in order for it to run. Remember, only program files have versions.

Getting File Attributes

To display the attributes of a file, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  fNAME  = "  filename  " Set  gFILE  = GetFile(  fNAME  )  gATTRIB  =  gFILE  .Attributes If  gATTRIB  and 1 Then  ReadOnly  = 1 Else  ReadOnly  = 0 If  gATTRIB  and 2 Then  Hidden  = 1 Else  Hidden  = 0 If  gATTRIB  and 4 Then  System  = 1 Else  System  = 0 If  gATTRIB  and 5 Then  Volume  = 1 Else  Volume  = 0 If  gATTRIB  and 16 Then  Directory  = 1 Else  Directory  = 0 If  gATTRIB  and 32 Then  Archive  = 1 Else  Archive  = 0 If  gATTRIB  and 64 Then  Alias  = 1 Else  Alias  = 0 If  gATTRIB  and 128 Then  Compressed  = 1 Else  Compressed  = 0 Wscript.Echo "FILE: " &  UCase  (  fNAME  ) & vblf & vblf & _   "Readonly:  " & vbtab &  ReadOnly  & vblf & _   "Hidden:    " & vbtab &  Hidden  & vblf & _   "System:    " & vbtab &  System  & vblf & _   "Volume:    " & vbtab &  Volume  & vblf & _   "Directory: " & vbtab &  Directory  & vblf & _   "Archive:   " & vbtab &  Archive  & vblf & _   "Alias:     " & vbtab & vbtab &  Alias  & vblf & _   "Compressed:" & vbtab &  Compressed  

Here, filename is the file that contains the attributes you want to get.

Note  

You need to append the GetFile routine, listed earlier in this chapter, to this script in order for it to run.

Related solution:

Found on page:

Getting File or Folder Details

110

Setting File Attributes

To set the attributes of a file, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  fNAME  = "  filename  "  ReadOnly  = 0  Hidden  = 0  System  = 0  Archive  = 0 Set  gFILE  = GetFile(  fNAME  )  gFILE  .Attributes = 0 Attribs = 0 If  ReadOnly  = 1 Then Attribs = Attribs + 1 If  Hidden  = 1 Then Attribs = Attribs + 2 If  System  = 1 Then Attribs = Attribs + 4 If  Archive  = 1 Then Attribs = Attribs + 32  gFILE  .Attributes = Attribs 

Here, filename is the file that contains the attributes you want to set. To modify filename 's attributes, change the value of the corresponding variable names ( ReadOnly , Hidden , System , Archive ) to 1 to enable, or 0 to disable.

Note  

You need to append the GetFile routine, listed earlier in this chapter, to this script in order for it to run.

Setting Attributes to All Files within Folders

To set the attributes of all files within a folder and its subfolders, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host from http://www.microsoft.com to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  sDIR  = "  directory  "  sReadOnly  = 0  sHidden  = 0  sSystem  = 0  sArchive  = 0 Set  objDIR  = GetFolder(  sDIR  ) GoSubFolders  objDIR  Sub MainSub (  objDIR  )   For Each  efile  in  objDIR  .Files     Set  gFILE  = GetFile(  efile  )  gFILE  .Attributes = 0     Attribs = 0     If  sReadOnly  = 1 Then Attribs = Attribs + 1     If  sHidden  = 1 Then Attribs = Attribs + 2     If  sSystem  = 1 Then Attribs = Attribs + 4     If  sArchive  = 1 Then Attribs = Attribs + 32  gFILE  .Attributes = Attribs   Next End Sub 

Here, directory contains the files whose attributes you want to set. To modify the attributes, change the values of the corresponding variable names ( ReadOnly , Hidden , System , Archive ) to 1 to enable, or 0 to disable.

Note  

You need to append the GetFile routine, the GetFolder routine, and the GoSubFolders routine listed earlier in this chapter to this script in order for it to run.

Appending Text Files

To append the contents of one text file to another, proceed as follows:

  1. Create a new directory to store all files included in this example.

  2. Download and install the latest version of Windows Script Host, from http://www.microsoft.com, to the new directory.

  3. Select StartRun and enter "cscript scriptfile .vbs."

Here, scriptfile is the full path and file name of a script file that contains the following:

 Set  FSO  = CreateObject("Scripting.FileSystemObject")  File1  = "  1stfile  "  File2  = "  2ndfile  " Set  txtFile1  = FSO.OpenTextFile(File1, 1) Set  txtFile2  = FSO.OpenTextFile(File2, 8) Do While  txtFile1  .AtEndOfline <> True  txtFile2  .WriteLine(txtFile1.Readline & vbcr) Loop txtFile1.close txtFile2.close 

Here, 1stfile is the file whose contents you want to append to 2ndfile .




Windows Admin Scripting Little Black Book
Windows Admin Scripting Little Black Book (Little Black Books (Paraglyph Press))
ISBN: 1933097108
EAN: 2147483647
Year: 2004
Pages: 89

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net