fileassign 文件移动,正则

文件重整脚本,制定好规则,将文件按规则重新调整目录

支持正则,支持解压

 

RegularAssign.js

//D:\PersonalSet\Desktop> cscript /x   /nologo RegularAssign.js "D:\\PersonalSet\\MyDocuments\\lotu.*" "d:\Temp\55\55\1.log" "OnlyOne|OnlyFile|DestPathAutoCreate|
//"d:\Program Files\WinRAR\WinRAR.exe" x -y "d:\PersonalSet\Pictures\第十期学员合影.rar" "d:\PersonalSet\Pictures\1"

var fso = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var g_tmpFolder = GetClearTmpFolder();
var bDebug = false;

function GetRandomFileName()
{
    return ("-" + Math.random());
}

Array.prototype.Clear = function()
{
    this.splice(0, this.length);
}
RegExp.prototype.ExecNoRecord = function(str){
    var ret = this.exec(str);
    this.lastIndex = 0;
    return ret;
}

// 数组拷贝方法,数组直接赋值只相当于赋值引用
Array.prototype.Copy = function()
{
    // 重新生成一个数组返回出去
    var ret = new Array();
    return ret.concat(this);
}

function RunCmd(strCmd)
{
    return WshShell.Run(strCmd, 0, true);
}

function Output(str)
{
    WScript.StdOut.WriteLine(str);
}

function Debug(str)
{
    if(bDebug)
    {
        Output(str);
    }
}

function OutputArray(aryStr)
{
    for(var i = 0; i < aryStr.length; ++i)
    {
        Output(aryStr[i]);
    }
}

function ExistInArray(aryValues, value)
{
    for(var i = 0; i < aryValues.length; ++i)
    {
        if(aryValues[i] == value)
        {
            return true;
        }
    }
    return false;
}

function SplitPath(strPath)
{
    var bFirstPart = true;
    for(var i = (strPath.length - 1); i >= 0 ; --i)
    {
        if(strPath.charAt(i) == "\\")
        {
            if(bFirstPart)
            {
                return;
            }

            break;
        }
        else
        {
            bFirstPart = false;
        }
    }

    if(i <= 0)
    {
        return {strParentPath:"",strFileName:""};
    }
    else
    {
        return {strParentPath:strPath.substr(0, i),strFileName:strPath.substr(i + 1, strPath.length - 1 - i)};
    }
}

function SplitName(strName)
{
    for(var i = (strName.length - 1); i >=0; --i)
    {
        if(strName.charAt(i) == ".")
        {
            break;
        }
    }
    if(i < 0)
    {
        return {strMainName:"", strExtName:""};
    }
    else
    {
        return {strMainName:strName.substr(0, i), strExtName:strName.substr(i + 1, strName.length - 1 - i)};
    }
}

function CreateFolder(strPath)
{
    var aryPathParts = strPath.split("\\");

    if(aryPathParts.length == 0)
    {
        return false;
    }

    if(aryPathParts[aryPathParts.length - 1] == "")
    {
        aryPathParts.splice(aryPathParts.length - 1, 1);
    }

    if(aryPathParts.length == 0)
    {
        return false;
    }

    for(var i = 0; i < (aryPathParts.length); ++i)
    {
        if(aryPathParts[i] == "")
        {
            return false;
        }
    }

    var path = fso.GetFolder(aryPathParts[0] + "\\");

    for(var i = 1; i < aryPathParts.length; ++i)
    {
        // 遍历文件夹
        var foldersK = new Enumerator(path.SubFolders);
        for (; !foldersK.atEnd(); foldersK.moveNext())
        {
            var objFolder = foldersK.item();
            if(objFolder.Name == aryPathParts[i])
            {
                path = objFolder;
                break;
            }
        }
        
        if(foldersK.atEnd())
        {
            path = path.SubFolders.Add(aryPathParts[i]);
        }
    }

    return fso.FolderExists(strPath);
}

function CFile(fileObj, relativePath)
{
}

function FindRegularPath(strRegPath, aryFolders, aryFiles)
{
    var aryPathParts = strRegPath.split("\\\\");
    for(var i = 0; i < (aryPathParts.length - 1); ++i)
    {
        if(aryPathParts[i] == "")
        {
            Output("!!!Path express error!!! express:" + strRegPath);
            return;
        }
    }
    
    var aryTempFolders1 = new Array();
    var rootDir = fso.GetFolder(aryPathParts[0] + "\\");
    aryTempFolders1.push(rootDir);

    for(var i = 1; i < aryPathParts.length; ++i)
    {
        var bIsLast = (i == (aryPathParts.length - 1));

        var aryTempFolders2 = new Array();
        var regPathPart;
        try 
        {
            regPathPart = new RegExp(aryPathParts[i], "gm");
        }
        catch(e)
        {
            aryFiles.Clear();
            aryFolders.Clear();
            Output("!!!Path express error!!! part:"+ aryPathParts[i] + " express:" + strRegPath);
            return;
        }
        
        for(var j = 0; j < aryTempFolders1.length; ++j)
        {
            // 遍历文件夹
            var foldersK = new Enumerator(aryTempFolders1[j].SubFolders);
            for (; !foldersK.atEnd(); foldersK.moveNext())
            {
                var objFolder = foldersK.item();
                var strSubFolderName = objFolder.Name;
                var reret = regPathPart.ExecNoRecord(strSubFolderName);
                if(reret && (reret[0] == strSubFolderName))
                {
                    aryTempFolders2.push(objFolder);
                }
            }

            if(!bIsLast)
            {
                // 遍历文件
                var filesK = new Enumerator(aryTempFolders1[j].Files);
                for (; !filesK.atEnd(); filesK.moveNext())
                {
                    var objFile = filesK.item();
                    var strSubFileName = objFile.Name;
                    var reret = regPathPart.ExecNoRecord(strSubFileName);
                    if(reret && (reret[0] == strSubFileName) && (objFile.Type.substr(0, 6) == "WinRAR"))
                    {
                        var objExtractedFolder = UnrarToTmpFolder(objFile.Path);
                        if(objExtractedFolder)
                        {
                            aryTempFolders2.push(objExtractedFolder);
                        }
                    }
                }
            }
            else
            {
                // 遍历文件
                var filesK = new Enumerator(aryTempFolders1[j].Files);
                for (; !filesK.atEnd(); filesK.moveNext())
                {
                    var objFile = filesK.item();
                    var strSubFileName = objFile.Name;
                    var reret = regPathPart.ExecNoRecord(strSubFileName);
                    if(reret && (reret[0] == strSubFileName))
                    {
                        aryFiles.push(objFile);
                    }
                }
            }
        }
        
        if(aryTempFolders2.length == 0)
        {
            for(var k = 0; k < aryTempFolders1.length; ++k)
            {
                Debug(aryTempFolders1[k].Path);
            }
        }

        aryTempFolders1 = aryTempFolders2.Copy();
    }
    
    /*for(var i = 0; i < aryFiles.length; ++i)
    {
        Output(aryFiles[i].Path);
    }

    for(var i = 0; i < aryTempFolders1.length; ++i)
    {
        Output(aryTempFolders1[i].Path);
    }*/
    
    for(var i = 0; i < aryTempFolders1.length; ++i)
    {
        aryFolders.push(aryTempFolders1[i]);
    }
}

function GetClearTmpFolder()
{
    var g_tmpFolder;
    var tmpFolder = fso.GetSpecialFolder(2);
    // 遍历文件夹
    var foldersK = new Enumerator(tmpFolder.SubFolders);
    for (; !foldersK.atEnd(); foldersK.moveNext())
    {
        var objFolder = foldersK.item();
        if(objFolder.Name == WScript.ScriptName)
        {
            g_tmpFolder = objFolder;
        }
    }
    if(!g_tmpFolder)
    {
        tmpFolder.SubFolders.Add(WScript.ScriptName);
        // 遍历文件夹
        var foldersK = new Enumerator(tmpFolder.SubFolders);
        for (; !foldersK.atEnd(); foldersK.moveNext())
        {
            var objFolder = foldersK.item();
            if(objFolder.Name == WScript.ScriptName)
            {
                g_tmpFolder = objFolder;
            }
        }
    }
    else
    {
        try 
        {
            // 删除所有文件、文件夹
            var foldersK = new Enumerator(g_tmpFolder.SubFolders);
            for (; !foldersK.atEnd(); foldersK.moveNext())
            {
                var objFolder = foldersK.item();
                objFolder.Delete(true);
            }
            var filesK = new Enumerator(g_tmpFolder.Files);
            for (; !filesK.atEnd(); filesK.moveNext())
            {
                var objFile = filesK.item();
                objFile.Delete(true);
            }

        }
        catch(e)
        {
            // 无需处理,没删掉就没删吧。
        }
    }
    return g_tmpFolder;
}

function ExistFileOrFolder(strPath)
{
    if(fso.FileExists(strPath))
    {
        return true;
    }
    if(fso.FolderExists(strPath))
    {
        return true;
    }
    return false;
}

function DeleteFileOrFolder(strPath)
{
    if(fso.FileExists(strPath))
    {
        var oldFile = fso.GetFile(strPath);
        oldFile.Delete(true);
    }
    if(fso.FolderExists(strPath))
    {
        var oldFolder = fso.GetFolder(strPath);
        oldFolder.Delete(true);
    }
}

function UnrarToTmpFolder(strRarFilePath)
{
    var strExtractCmd = "\"d:\\Program Files\\WinRAR\\WinRAR.exe\" x -y -ibck ";
    do
    {
        var strSubFileName = GetRandomFileName();
        strExtractToPath = g_tmpFolder.Path + "\\" + strSubFileName;
    } while(ExistFileOrFolder(strExtractToPath))

    g_tmpFolder.SubFolders.Add(strSubFileName);
    strCmd = strExtractCmd + "\"" + strRarFilePath + "\"" + " " + "\"" + strExtractToPath + "\"";
    var objExtractedFolder
    if(RunCmd(strCmd) == 0)
    {
        objExtractedFolder = fso.GetFolder(strExtractToPath);
    }
    return objExtractedFolder;
}

function main()
{
    //OnlyOne
    var bAllowMulti = true;
    //OnlyFile OnlyFolder
    var bSourceContainFile = true;
    var bSourceContainFolder = true;
    //DestAutoCreate
    var bDestPathAutoCreate = false;
    //MoveMode
    var bCopyMode = true;
    //RenameTo
    var bRenameTo = false;
    //OverWrite
    var bOverWrite = false;
    //Silent
    var bIsSilent = false;

    if((WScript.Arguments.length < 2) || (WScript.Arguments.length > 3))
    {
        Output("Arguments num error.");
        return;
    }

    if((WScript.Arguments(0) == "") || (WScript.Arguments(1) == ""))
    {
        Output("Arguments value error.");
        return;
    }

    if(WScript.Arguments.length == 3 && WScript.Arguments(2) != "")
    {
        var strOptionList = WScript.Arguments(2);
        var aryOptions = strOptionList.split("|");
        if(ExistInArray(aryOptions, "OnlyFile"))
        {
            bSourceContainFolder = false;
        }
        if(ExistInArray(aryOptions, "OnlyFolder"))
        {
            bSourceContainFile = false;
        }
        if(ExistInArray(aryOptions, "OnlyOne"))
        {
            bAllowMulti = false;
        }
        if(ExistInArray(aryOptions, "DestPathAutoCreate"))
        {
            bDestPathAutoCreate = true;
        }
        if(ExistInArray(aryOptions, "MoveMode"))
        {
            bCopyMode = false;
        }
        if(ExistInArray(aryOptions, "OverWrite"))
        {
            bOverWrite = true;
        }
        if(ExistInArray(aryOptions, "RenameTo"))
        {
            bRenameTo = true;
        }
        if(ExistInArray(aryOptions, "Silent"))
        {
            bIsSilent = true;
        }

        // 冲突排除
        if(bRenameTo)
        {
            bAllowMulti = false;
        }
    }

    if(!bSourceContainFile && !bSourceContainFolder)
    {
        Output("No file No folder.");
        return;
    }

    var strDest = WScript.Arguments(1);
    var strDestFolder = "";
    var strRename = "";
    if(bRenameTo)
    {
        var objSplitResult = SplitPath(strDest);
        if((objSplitResult.strParentPath == "") || (objSplitResult.strFileName == ""))
        {
            Output("Rename to dest error.")
            return;
        }
        strDestFolder = objSplitResult.strParentPath;
        strRename = objSplitResult.strFileName;
    }
    else
    {
        Output(strDestFolder);
        strDestFolder = strDest;
    }

    var dest;
    // 先找目的地址
    if (!fso.FolderExists(strDestFolder))
    {
        if(!bDestPathAutoCreate)
        {
            Output("Path not exist. path:" + strDestFolder);
            return;
        }
        if(!CreateFolder(strDestFolder))
        {
            Output("Create path failed. path:" + strDestFolder);
            return;
        }
    }

    dest = fso.GetFolder(strDestFolder);

    var aryFolders = new Array();
    var aryFiles = new Array();
    FindRegularPath(WScript.Arguments(0), aryFolders, aryFiles);

    var iFileCount = 0;
    if(bSourceContainFile)
    {
        iFileCount += aryFiles.length;
    }
    if(bSourceContainFolder)
    {
        iFileCount += aryFolders.length;
    }
    

    if(iFileCount == 0)
    {
        Output("No source file or folder. source path:" + WScript.Arguments(0));
        return;
    }
    else if(iFileCount > 1)
    {
        if(!bAllowMulti)
        {
            Output("!!!Oh, Multi!!! source path:" + WScript.Arguments(0))
            return;
        }
    }

    var arySrcs = new Array();
    if(bSourceContainFile)
    {
        for(var i = 0; i < aryFiles.length; ++i)
        {
            var objTmpFile = aryFiles[i];
            arySrcs.push(objTmpFile.Path);
            var bNeedRename = false;
            if(bRenameTo)
            {
                if(objTmpFile.Name == strRename)
                {
                    Debug("No need to change file name. new name:" + strRename);
                    bNeedRename = false;
                }
                else
                {
                    bNeedRename = true;
                }
            }

            if(bNeedRename)
            {
                if(ExistFileOrFolder(dest.Path + "\\" + strRename))
                {
                    if(!bOverWrite)
                    {
                        Output("Fild or folder exist." + dest.Path + "\\" + strRename);
                        return;
                    }
                    DeleteFileOrFolder(dest.Path + "\\" + strRename);
                }
                // 覆盖当前,需要先拷贝,后重命名
                objTmpFile.Copy(g_tmpFolder.Path + "\\", false);
                var newFile = fso.GetFile(g_tmpFolder.Path + "\\" + objTmpFile.Name);
                newFile.Name = strRename;
                newFile.Move(dest.Path + "\\");
            }
            else
            {
                if(ExistFileOrFolder(dest.Path + "\\" + objTmpFile.Name))
                {
                    if(!bOverWrite)
                    {
                        Output("Fild or folder exist." + dest.Path + "\\" + objTmpFile.Name);
                        return;
                    }
                    DeleteFileOrFolder(dest.Path + "\\" + objTmpFile.Name);
                }
                objTmpFile.Copy(dest.Path + "\\", false);
            }
        }
    }

    if(bSourceContainFolder)
    {
        for(var i = 0; i < aryFolders.length; ++i)
        {
            var objTmpFolder = aryFolders[i];
            arySrcs.push(objTmpFolder.Path);
            var bNeedRename = false;
            if(bRenameTo)
            {
                if(objTmpFolder.Name == strRename)
                {
                    Debug("No need to change file name. new name:" + strRename);
                    bNeedRename = false;
                }
                else
                {
                    bNeedRename = true;
                }
            }

            if(bNeedRename)
            {
                if(ExistFileOrFolder(dest.Path + "\\" + strRename))
                {
                    if(!bOverWrite)
                    {
                        Output("Fild or folder exist." + dest.Path + "\\" + strRename);
                        return;
                    }
                    DeleteFileOrFolder(dest.Path + "\\" + strRename);
                }
                // 覆盖当前,需要先拷贝,后重命名
                objTmpFolder.Copy(g_tmpFolder.Path + "\\", false);
                var newFolder = fso.GetFolder(g_tmpFolder.Path + "\\" + objTmpFolder.Name);
                newFolder.Name = strRename;
                //newFolder.Move(dest.Path + "\\");
                //newFolder.Move("d:");
                //fso.MoveFolder(newFolder.Path, dest.Path + "\\");
                newFolder.Copy(dest.Path + "\\");
                newFolder.Delete(true);
            }
            else
            {
                if(ExistFileOrFolder(dest.Path + "\\" + objTmpFolder.Name))
                {
                    if(!bOverWrite)
                    {
                        Output("File or folder exist." + dest.Path + "\\" + objTmpFolder.Name);
                        return;
                    }
                    DeleteFileOrFolder(dest.Path + "\\" + objTmpFolder.Name);
                }
                objTmpFolder.Copy(dest.Path + "\\", false);
            }
        }
    }

    if(!bIsSilent)
    {
        OutputArray(arySrcs);
        Output(">>>" + strDest);
    }
}

function help()
{
    Output("OnlyFile");
    Output("OnlyFolder");
    Output("OnlyOne");
    Output("DestPathAutoCreate");
    Output("OverWrite");
    Output("RenameTo");
    Output("Silent");
}

if(0 == WScript.Arguments.length)
{
    help();
}
else
{
    main();
}

 

 

 

RA.bat

::用法D:\PersonalSet\Desktop>D:\PersonalSet\Desktop\RA.bat  "E:\Source\" D:\Dest\


@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
::切换到目录
cd /d %~dp0
set SRC_DIR=%~1
::进工作目录
IF NOT EXIST %SRC_DIR% (
    echo No %SRC_DIR%!!!
    EXIT
)

set DEST_DIR=%~2
::进工作目录
IF NOT EXIST %DEST_DIR% (
    echo No %DEST_DIR%!!!
    EXIT
)

call :FORMATFOLDERPATH "!SRC_DIR!"
set SRC_DIR=!FORMATFOLDERPATH!

call :FORMATFOLDERPATH "!DEST_DIR!"
set DEST_DIR=!FORMATFOLDERPATH!

set SRC_DIR=!SRC_DIR:\=\\!

call :RA                    "SOURCE\\.*\.rpm" "DEST\rpm" "OnlyOne|OnlyFile|DestPathAutoCreate"

GOTO :eof

:MOVEAFileTOFile
    call :RANOREG "%~1" "%~2" "OnlyOne|OnlyFile|DestPathAutoCreate|RenameTo"
GOTO :eof

:MOVEAFileToFolder
    call :RANOREG "%~1" "%~2" "OnlyOne|OnlyFile|DestPathAutoCreate"
GOTO :eof

:RANOREG
    ::拼路经
    set TMP_SRC_DIR="%~1"
    set TMP_SRC_DIR=!TMP_SRC_DIR:\=\\!
    call :RA !TMP_SRC_DIR! "%~2" "%~3"
GOTO :eof
    
:RA
    ::拼路经
    set TMP_SRC_DIR="!SRC_DIR!%~1"
    set TMP_DEST_DIR="!DEST_DIR!%~2"
    set TMP_OPTION="%~3|Silent"
    ::执行
    cscript /d  /nologo RegularAssign.js !TMP_SRC_DIR! !TMP_DEST_DIR! !TMP_OPTION!
GOTO :eof 

:FORMATFOLDERPATH
    set strPath=%~1
    call :STRLEN "strPath"
    set /a STREND=STRLEN-1
    IF NOT "!strPath:~%STREND%,1!"=="\" (
        set strPath=!strPath!\
    )
    set FORMATFOLDERPATH=!strPath!
GOTO :eof

:STRLEN
    set str=%~1
    set cur=0;

    :while
        if "!str:~%cur%,1!"=="" (
            set /a STRLEN=cur
        ) else (
            set /a cur=cur+1
            goto :while
        )
GOTO :eof

 

posted @ 2016-04-16 01:09  dzqabc  阅读(16)  评论(0编辑  收藏  举报