【问题标题】:Using Replace function in VBScript to rename a group of folders使用 VBScript 中的 Replace 函数重命名一组文件夹
【发布时间】:2015-11-10 20:08:52
【问题描述】:

我正在尝试创建一个脚本,该脚本将在文件夹中的一组子文件夹的名称中插入 2 个字符。以下是这些文件夹的详细信息:

  • 每个文件夹都以 14 位数字和下划线开头(例如 60818400200000_)

  • 文件夹名称长度不一

  • 某些文件夹名称中包含额外的下划线

脚本需要在第一个下划线之后插入一个破折号和一个下划线 (-_),或者将第一个下划线替换为下划线-破折号-下划线 (__-_)。

之后的每个文件夹应类似于 [14 位数字]_-_[文件名的其余部分]。

这是我目前的想法:

Dim objFso, folder, fc, rname as string

Set objFso = CreateObject("Scripting.FileSystemObject")
Set folder = objFso.GetFolder("F:\Eagle_Ford_20130220\TO_LOAD")
Set fc = folder.SubFolders

Set rname = Mid(folder.Name,15,1)

For each folder in fc

    If rname = "_" Then
        rname = rname.replace("_","_-_")

    End If


Next

Wscript.Echo "Finished"

但是,每当我运行此脚本时,我都会收到某种错误消息。如果我没有将 rname 定义为字符串,我最终会收到“需要对象”错误消息。如果我将 rname 定义为字符串(如上面的脚本所示),我最终会出现“预期语句结束”错误。

我在网络上到处查看以找出我做错了什么。这里有人愿意为我指出正确的方向吗?我将永远感激不尽! :)

编辑:

从 Rory 那里得到一些指导后,我稍微修改了我的脚本:

Dim objFso, folder, sfolder, rname

Set objFso = CreateObject("Scripting.FileSystemObject")
Set folder = objFso.GetFolder("F:\Eagle_Ford_20130220\TO_LOAD")
Set sfolder = folder.SubFolders


For each n in sfolder

rname = Mid(folder.Name,15,1)

    If rname = "_" Then
        folder.name = rname.replace("_","_-_")

    End If


Next

Wscript.Echo "Finished"

主要更改是重命名我的几个变量并删除重命名变量的 Set 和字符串定义。我还在 For Each 语句中移动了我的 rname 变量,这消除了我不断收到的 Object 错误。

脚本运行,但未对脚本中列出的文件夹中的子文件夹进行任何更改。我已经使用 Echo 命令测试了 For Each 语句,以确保它正在拾取每个文件夹(确实如此)。我唯一能得出的结论是我的 If 语句有问题。

我已经通过几个调试器运行了我的脚本,但没有收到任何错误消息。我非常感谢任何额外的帮助,尤其是因为编码不是我的强项(显然)。

【问题讨论】:

  • VBScript 中不存在强类型,即不能使用rname as string。如果你把它关掉,就像你说的那样,object required 错误发生在哪里?
  • 另外,您正在重新使用 folder 变量。您通过Set folder = objFso.GetFolder("F:\Eagle_Ford_20130220\TO_LOAD") 分配它,然后通过For each folder in fc 在for 循环中再次分配它。只是指出这一点。不是一个好主意——这是一种代码味道。
  • 第 7 行,字符 1,它是 rname 的设置行。

标签: vbscript


【解决方案1】:

您的脚本存在一些问题。首先,VBScript 不支持强类型变量,因此您不能像在其他风格的 Visual Basic 中那样使用 As 关键字。所以在你的变量声明中去掉它:

Dim objFso, folder, fc, rname '<-- no "As String"

接下来,您在第 7 行收到“需要对象”错误,因为您只能在 VBScript 中将 Set 关键字与对象引用一起使用。 Mid 函数返回一个字符串,它不是对象引用,因此会出现错误。要修复它,只需摆脱 Set:

rname = Mid(folder.Name,15,1)

另外,您正在重新使用您的 folder 变量。您通过Set folder = objFso.GetFolder("F:\Eagle_Ford_20130220\TO_LOAD") 分配它,然后通过For each folder in fc 在for 循环中再次分配它。这不应该影响您编写的脚本,但这不是一个好主意——它是code smell。如果您更改脚本,以后可能会导致错误。

【讨论】:

  • Roryap,感谢您的回复和帮助。我从 rname 前面删除了“Set”,但是虽然我没有收到任何编译错误,但没有进行更改。脚本一直运行,直到出现“完成”窗口。您提到了文件夹变量的重用。我将 For Each 语句更改为“For Each x in fc”,但这仍然没有解决任何问题——脚本没有替换任何内容。
  • 嗯,你怎么知道的?除非您遗漏了一些代码,否则您在替换后不会对 rname 做任何事情。它应该做什么?
  • 我有一个测试文件夹,其中包含两个子文件夹,其名称与我在最初帖子中描述的一样(14 位数字后跟下划线,然后是文件夹名称的其余部分)。该脚本应该用 underscore-dash-underscore (_-_) 替换它找到的第一个下划线。我的其余代码在上面的 rname 定义之后。
  • 您是否尝试过在脚本调试器中对其进行调试,以便在您逐步执行时查看它实际在做什么?
【解决方案2】:

我终于弄清楚我做错了什么。这是我为遇到此问题的其他人提出的脚本:

'Script to add two (or more) characters to a folder name
Dim objFso, folder, sfolder

Set objFso = CreateObject("Scripting.FileSystemObject")
Set folder = objFso.GetFolder("F:\Eagle_Ford_20130220\Loaded") 'Folder with subfolders to be renamed
Set sfolder = folder.SubFolders


For each folder in sfolder

    'Position to start search of folder name
    rname = Mid(folder.Name,15,1)

    'Search for subfolders with a particular string
    If rname = "_" Then 
        'Add/Replace characters to subfolder name
        rname = Replace(mid(folder.name,15,1),"_","_-_")

        'Write out new subfolder name
        folder.name = left(folder.name,14) & rname & mid(folder.name,16,len(folder.name))

    End If


Next

Wscript.Echo "Finished"

感谢那些帮助我解决这个问题的人。

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2020-04-03
    • 2015-05-10
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多