用vbs读取远程计算机上的文本文件的代码

问:
您好,脚本专家!如何读取远程计算机上的文本文件?
-- BM
答:
您好,BM。我们得承认:我们在利用您和您的问题来达成我们自己的邪恶目的。本周早些时候我们回答了有关如何读取一组文本文件最后一行的问题;在回答中,我们承诺将会说明如何使用 FileSystemObject 对远程计算机执行同样的功能。这并无恶意,只是为了维护本专栏的精神,除非有人提出有关对远程计算机上的文本文件进行处理的问题,我们是不会做出回答的。于是我们选择了您的问题。
因此,没错,我们在利用您。但如果往好处想,您的问题得到了回答。事实上,让我们先来看一看您的问题。
如您所知,FileSystemObject(用于读写文本文件的对象)的原本用于本地;而事实上,您读过的有关 FileSystemObject 的任何材料差不多都会煞费苦心地指出,不能对远程计算机使用该对象。尽管事实并非完全如此:那是因为 FileSystemObject 可以使用 UNC 路径。假定要读取的文件位于文件共享目录中 (\\atl-fs-01\public\myfile.txt)。在这种情况下,打开和读取文本文件就像下面的代码那样简单:


代码如下:

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objTextFile = objFSO.OpenTextFile _ 
    ("\\atl-fs-01\public\myfile.txt", ForReading) 
strContents = objTextFile.ReadAll 
objTextFile.Close 
Wscript.Echo strContents

如您所看到的,我们先是定义一个名为 ForReading 的常量并将其值设置为 1。然后创建 FileSystemObject 引用,并调用 OpenTextFile 方法,传递两个参数:要操作的文件的 UNC 路径及常量 ForReading。此时我们已经可以对文件进行所需的任何操作:给您举一个操作文本文件的简单例子:调用 ReadAll 方法将文件的全部内容读入名为 strContents 的变量中。然后关闭文件并回显 strContents 的值,就是这样。
目前,只要待操作的文件位于共享文件夹中,这段代码便很有效。但如果文件不在共享文件夹中,该怎么办呢?在这种情况下,就只能使用管理共享(如 C$)。即使尚未共享文件夹 C:\Public,以下脚本也能够读取文件 MyFile.txt:


代码如下:

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objTextFile = objFSO.OpenTextFile _ 
    ("\\atl-fs-01\C$\public\myfile.txt", ForReading) 
strContents = objTextFile.ReadAll 
objTextFile.Close 
Wscript.Echo strContents

如果不使用管理共享,那多半没什么办法。(除非您真的要做出某些疯狂的举动,如使用 WSHController 对象。但那就要另当别论了。)
而这便引出了我们的不可告人目的:如何遍历远程文件夹中的所有文件并使用 FileSystemObject 打开和读取其中的每个文件?嗯,请看下面这种方法:


代码如下:

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
strComputer = "atl-fs-01" 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colFileList = objWMIService.ExecQuery _ 
    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _ 
        & "ResultClass = CIM_DataFile") 
For Each objFile In colFileList 
    strFilePath = "\\" & strComputer & "\C$\Logs\" & _ 
        objFile.FileName & "." & objFile.Extension 
    Set objTextFile = objFSO.OpenTextFile(strFilePath, ForReading) 
    strContents = objTextFile.ReadAll 
    Wscript.Echo strContents 
    objTextFile.Close 
Next

这段代码的作用是连接到远程计算机 atl-fs-01,并检索文件夹 C:\Logs 中所有文件的集合。棘手之处是构建每个文件的路径,那是因为我们需要使用与以下类似的管理共享路径:
\\atl-fs-01\C$\Logs\MyFile.log
为构建该路径,我们会各使用一些 WMI 和硬编码:
strFilePath = "\\" & strComputer & "\C$\Logs\" & _
    objFile.FileName & "." & objFile.Extension
我们要做的是:
• 以一对 \ 开头: \\
• 添加计算机名称:\\atl-fs-01
• 添加一个 \ 和管理共享路径 C$\Logs\:\\atl-fs-01\C$\Logs\
• 添加 WMI FileName 属性(只含文件名部分,不含文件扩展名):\\atl-fs-01\C$\Logs\MyFile
• 在文件名和文件扩展名之间添加句点(因为句点不是 WMI Extension 属性的一部分):\\atl-fs-01\C$\Logs\MyFile.
• 添加 WMI 属性 Extension:\\atl-fs-01\C$\Logs\MyFile.log
这稍显复杂,但它构建了我们需要的 UNC 路径。而且,每次完成循环时它都会替换新的文件名和新的文件扩展名(计算机名称和文件夹路径从不改变)。于是,我们最终能够打开(并读取)远程文件夹中的每个文件。
顺便向 BM 表示感谢,感谢您让我们利用您的问题。我们欠您一个人情!

(0)

相关推荐

  • 用vbs读取远程计算机上的文本文件的代码

    问: 您好,脚本专家!如何读取远程计算机上的文本文件? -- BM 答: 您好,BM.我们得承认:我们在利用您和您的问题来达成我们自己的邪恶目的.本周早些时候我们回答了有关如何读取一组文本文件最后一行的问题:在回答中,我们承诺将会说明如何使用 FileSystemObject 对远程计算机执行同样的功能.这并无恶意,只是为了维护本专栏的精神,除非有人提出有关对远程计算机上的文本文件进行处理的问题,我们是不会做出回答的.于是我们选择了您的问题. 因此,没错,我们在利用您.但如果往好处想,您的问题得

  • 用asp实现访问远程计算机上MDB access数据库文件的方法

    如果你用ODBC连接(DSN方式或其它方式)到远程计算机的MDB文件,这将产生一个错误:  Microsoft OLE DB Provider for ODBC Drivers error '80004005' 大致意思是该文件可能被其他用户访问或无足够的权限访问. 下面有两种方式,避免这个错误: 方式a. 使用DAO引擎访问  Dim File, Conn, RS  Const ReadOnly = False  File = "\\server\share\file.mdb"  S

  • VBS 添加右键计算文件MD5的实现代码

    最近相关的备份比较频繁,为了校验文件的完整性,老是要打开某文件HASH校验工具,比较麻烦,于是乎写了这个东东,文件较大时计算有点慢,文件的MD5值保存在剪贴板!效果如图: 使用方法: 1.先将GetMD5.reg文件导入注册表以添加右键菜单,GetMD5.reg代码如下: 复制代码 代码如下: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\HASH(&G)\command]@="WScript.exe //

  • at计划在指定时间和日期在计算机上运行命令和程序

    at计划在指定时间和日期在计算机上运行命令和程序.at 命令只能在"计划"服务运行时使用.如果在没有参数的情况下使用,则 at 列出已计划的命令. 语法 at [\\ComputerName] [{[ID] [/delete]|/delete [/yes]}] at [[\\ComputerName] hours:minutes [/interactive] [{/every:date[,...]|/next:date[,...]}] command] 参数 \\computernam

  • vbs中使用 ADO 读取所有数据均在一行上的文本文件的代码

    使用 ADO 读取所有数据均在一行上的文本文件问: 您好,脚本专家!我有一个固定宽度的文本文件,该文件包含名字(6 个字符).姓氏(13 个字符)和部门(9 个字符),并且它们均在同一行上.我该如何使用 ADO 来读取呢? -- DW 答: 您好,DW.坦白地讲,我们认为您不能使用 ADO(ActiveX 数据对象)读取这样的文件.ADO 是一种和文本文件进行交互的非常好的方法(有关详细信息,请参阅文章有关文本文件的 ADO 更多知识(英文)),但是,确实,ADO 有些挑剔:它的每项设置都必须完

  • 运行脚本之前,如何确定计算机上的默认脚本宿主的代码

    问: 您好,脚本专家!我知道,在运行脚本时,可使用代码确定脚本是否在 WScript 或 CScript 中运行.但我想不明白的是:运行脚本之前,如何确定计算机上的默认脚本宿主? -- AT 答: 您好,AT.您知道,人们完全难倒脚本专家并不是常事:不过我们不得不承认这个问题的确有点挑战性.(嗯,嗯:那么,或许它并不足以能够难倒脚本专家:老实说,事实上它相当简单.不过你们无需知道这些.)我们还不知道如何回答这个问题,但我们知道,为了帮助您解决这个问题,我们将会需要大量辛勤的工作和奉献. 但是,在

  • 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序报错的解决办法

    错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错: "未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序" 代码示例: static void Main(string[] args) { readexcel("D:\\test\\xlsxtest.xlsx"); } public static void readexcel(string _path) { Da

  • sql2005 本地计算机上的SQL SERVER服务启动后又停止了解决方法

    本方法主要是解决SQL Server运行过程中出现的"本地计算机上的MSSQLSERVER服务启动后又停止了.一些服务自动停止,如果它们没有什么可做的"解决方法. 笔者ASP运行环境:操作系统为Windows XP SP2,IIS的版本为默认的5.1,数据库为SQL Server 2005(MDAC版本为2.8) 一.出现"本地计算机上的MSSQLSERVER服务启动后又停止了.一些服务自动停止,如果它们没有什么可做的" 1.开始-->管理管理工具-->

  • ASP.NET使用HttpWebRequest读取远程网页源代码

    读取远程网页能做什么就不用多说了吧,做小偷程序或是采集,也就诸如此类了吧. public string GetPage(string url) { HttpWebRequest request = null; HttpWebResponse response = null; StreamReader reader = null; try { request = (HttpWebRequest)WebRequest.Create(url); request.Timeout = 20000; req

  • PHP file_get_contents函数读取远程数据超时的解决方法

    在网络状况比较差的情况下file_get_contents函数经常读取远程数据失败. 解决办法如下: 复制代码 代码如下: /*设置超时配合失败之后尝试多次读取,效果比原先好很多*/ $url = 'http://www.jb51.net';           $opts = array(            'http'=>array(           'method'=>"GET",           'timeout'=>1, //设置超时   )  

随机推荐