【问题标题】:JavaScript Batch-Renaming in a FolderJavaScript 批量重命名文件夹
【发布时间】:2018-08-22 02:05:40
【问题描述】:

我有一对字符串需要在给定文件夹的文件名中替换,例如BUL 到 Bg-bg,ENG 到 En-us,等等。这样的对有 12 个。我找到了一个脚本来处理一对替换,但是每当我尝试添加更多参数时,它以某种方式只循环一个并重命名一个匹配的字符串。无法计算出一个更简单的代码,它可以一次接受所有替换字符串对,而无需为每对字符串创建单独的循环。任何想法将不胜感激。

var sFolderName, sStringToFind;
var nResult;

sFolderName = "E:\\Users\\Username\\Desktop\\Sample"; // directory name
sStringToFind1 = "BUL";
sStringToReplace1 = "Bg-bg";
sStringToFind2 = "ENG";
sStringToReplace2 = "En-us";

nResult = renameFiles(sFolderName, sStringToFind1, sStringToReplace1, sStringToFind2, sStringToReplace2);
WScript.Echo(nResult + " files renamed");

//    Function Name:    renameFiles
//    sFolder:    Folder Name (use double backslashes)
//    sString1:    String to search for
//    sString2:    String to replace
//    Returns:    Number of files renamed

function renameFiles(sFolder, sString1, sString2, sString3, sString4) {
    var oFSO, oFile, oFolder;
    var re, index;
    var sName;
    var i = 0, n;

    oFSO = new ActiveXObject("Scripting.FileSystemObject");
    oFolder = oFSO.GetFolder(sFolder);
    try {
        index = new Enumerator(oFolder.Files);
        for (; !index.atEnd(); index.moveNext()) {
            oFile = index.item();
            sName = oFile.Name;
            n = sName.indexOf(sString1);
            if(n != -1) {
                try {
                    sName = sName.substring(0, n) + sString4 + 
                            sName.substr(n + sString3.length);
                    oFile.Name = sName;
                    i++;
                } catch(e) {
                    WScript.Echo("Can not rename file " + sName + " because\n" + e.description);
                }
            }
        }
                index = new Enumerator(oFolder.Files);
        for (; !index.atEnd(); index.moveNext()) {
            oFile = index.item();
            sName = oFile.Name;
            n = sName.indexOf(sString3);
            if(n != -1) {
                try {
                    sName = sName.substring(0, n) + sString4 + 
                            sName.substr(n + sString3.length);
                    oFile.Name = sName;
                    i++;
                } catch(e) {
                    WScript.Echo("Can not rename file " + sName + " because\n" + e.description);
                }
            }
        }
    }
    catch(e) {
        WScript.Echo("Could not access folder " + sFolder + " because\n" + e.description);
        return 0;
    } finally {
        oFSO = null;
        re = null;
        return i;
    }
}

【问题讨论】:

  • 你不知道js字符串对象的replace方法吗?为什么不能使用 sName = sName.replace(sString1, sString2); 之类的东西?
  • 是的,让它变得不必要的复杂......

标签: rename batch-processing wsh jscript batch-rename


【解决方案1】:

您可以使用replace() 并在同一个循环内进行所有替换:

function renameFiles(sFolder, sString1, sString2, sString3, sString4) {
    var oFSO, oFile, oFolder;
    var re, index;
    var sName;
    var i = 0, n;

    oFSO = new ActiveXObject("Scripting.FileSystemObject");
    oFolder = oFSO.GetFolder(sFolder);
    try {
        index = new Enumerator(oFolder.Files);
        for (; !index.atEnd(); index.moveNext()) {
            oFile = index.item();
            sName = oFile.Name;

            sName = sName.replace(sString1, sString2);
            sName = sName.replace(sString3, sString4);

            if (oFile.Name != sName) {
                i++;
                oFile.Name = sName;
            }
        }
    }
    catch(e) {
        WScript.Echo("Could not access folder " + sFolder + " because\n" + e.description);
        return 0;
    } finally {
        oFSO = null;
        re = null;
        return i;
    }
}

或者您可以使用数组 os 对,并遍历这些对并传递任意数量的对...

renameFiles(sFolder, [
    [sStringToFind1, sStringToReplace1],
    [sStringToFind2, sStringToReplace2],
    // ...,
    [sStringToFindN, sStringToReplaceN],
]);

function renameFiles(sFolder, arrayOfPairs) {
    var oFSO, oFile, oFolder;
    var re, index;
    var sName;
    var i = 0, n;

    oFSO = new ActiveXObject("Scripting.FileSystemObject");
    oFolder = oFSO.GetFolder(sFolder);
    try {
        index = new Enumerator(oFolder.Files);
        for (; !index.atEnd(); index.moveNext()) {
            oFile = index.item();
            sName = oFile.Name;

            for (var j = 0; j < arrayOfPairs.length; j++) {
                sName = sName.replace(arrayOfPairs[j][0], arrayOfPairs[j][1]);
            }

            if (oFile.Name != sName) {
                i++;
                oFile.Name = sName;
            }
        }
    }
    catch(e) {
        WScript.Echo("Could not access folder " + sFolder + " because\n" + e.description);
        return 0;
    } finally {
        oFSO = null;
        re = null;
        return i;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2015-12-03
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多