使用VBScript中的替换函数重命名一组文件夹

使用VBScript中的替换函数重命名一组文件夹,vbscript,Vbscript,我正在尝试创建一个脚本,该脚本将在文件夹中一组子文件夹的名称中插入2个字符。以下是这些文件夹的详细信息: 每个文件夹都以一个14位数字和一个下划线开头(例如608184000200000) 文件夹名称的长度各不相同 某些文件夹名称的名称中有其他下划线 脚本需要在第一个下划线之后插入一个破折号和一个下划线(-),或者将第一个下划线替换为一个下划线-破折号下划线(-) 之后的每个文件夹应类似于[14位数字]\u-\ uu[文件名的其余部分] 以下是我到目前为止得出的结论: Dim objFso,

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

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

  • 文件夹名称的长度各不相同

  • 某些文件夹名称的名称中有其他下划线

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

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

以下是我到目前为止得出的结论:

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定义为字符串,那么最终会出现一条“objectrequired”错误消息。如果我将rname定义为字符串(如上面的脚本所示),那么最终会出现“Expected end of statement”错误

我在网上到处找,想知道我做错了什么。这里有人愿意为我指出正确的方向吗?我会非常感激的!:)

编辑:

从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"
主要的更改是重命名几个my变量,并删除重命名变量的Set和string定义。我还将rname变量移动到For-Each语句中,这消除了我不断得到的对象错误

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


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

您的脚本有一些问题。首先,VBScript不支持强类型变量,因此不能像使用其他版本的visual basic那样将
用作
关键字。因此,请在变量声明中去掉这一点:

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

此外,您正在使用
文件夹
变量。通过
Set folder=objFso.GetFolder(“F:\Eagle\u Ford\u 20130220\TO\u LOAD”)
分配它,然后通过
在for循环中为fc中的每个文件夹重新分配它。这不应该影响你写的脚本,但这不是一个好主意——这是一个错误。如果您以后更改脚本,可能会导致bug。

我终于明白我做错了什么。以下是我为其他有此问题的人准备的脚本:

'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"

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

VBScript中不存在强类型,即不能将
rname用作字符串。如前所述,如果不使用该选项,那么对象所需的错误会发生在哪里?此外,您正在使用
文件夹
变量。通过
Set folder=objFso.GetFolder(“F:\Eagle\u Ford\u 20130220\TO\u LOAD”)
分配它,然后通过
在for循环中为fc中的每个文件夹重新分配它。只是指出这点。这不是一个好主意——这是一个代码味道。第7行,Char 1,它是rname.Roryap的设置行,谢谢您的回复和帮助。我从rname前面删除了“Set”,但是虽然我没有得到任何编译错误,但是没有进行更改。脚本将一直运行,直到出现“完成”窗口。您提到了文件夹变量的重用。我将For Each语句改为“For Each x in fc”,但这仍然没有解决任何问题--脚本没有替换任何内容。好吧,你怎么知道的?在替换之后,您不能使用
rname
执行任何操作,除非您遗漏了一些代码。它应该做什么呢?我有一个测试文件夹,其中有两个子文件夹的名称,就像我在第一篇文章中描述的那样(14位数字后跟下划线,然后是文件夹名称的其余部分)。脚本应该将找到的第一个下划线替换为下划线-破折号下划线(--)。我的代码的其余部分在上面的rname定义之后。您是否尝试过在脚本调试器中调试它,以查看它在逐步执行时的实际操作?
'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"