Sorting files by numerical order

后端 未结 2 700
小鲜肉
小鲜肉 2020-12-02 02:49

I have a batch that create shortcut based on the order of files, the problem is that when it comes to numbers he presents the following problem when passing the number 100.<

相关标签:
2条回答
  • 2020-12-02 03:17
    Set Arg = WScript.Arguments
    set WshShell = createObject("Wscript.Shell")
    Set Inp = WScript.Stdin
    Set Outp = Wscript.Stdout
        Set rs = CreateObject("ADODB.Recordset")
        If LCase(Arg(1)) = "n" then
        With rs
            .Fields.Append "SortKey", 4 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                If IsNumeric(Sortkey) = False then
                    Set RE = new Regexp
                    re.Pattern = "[^0-9\.,]"
                    re.global = true
                    re.ignorecase = true
                    Sortkey = re.replace(Sortkey, "")
                End If
                If IsNumeric(Sortkey) = False then
                    Sortkey = 0
                ElseIf Sortkey = "" then
                    Sortkey = 0
                ElseIf IsNull(Sortkey) = true then
                    Sortkey = 0
                End If
                .AddNew
                .Fields("SortKey").value = CSng(SortKey)
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
    
        ElseIf LCase(Arg(1)) = "d" then
        With rs
            .Fields.Append "SortKey", 4 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                If IsDate(Sortkey) = False then
                    Set RE = new Regexp
                    re.Pattern = "[^0-9\\\-:]"
                    re.global = true
                    re.ignorecase = true
                    Sortkey = re.replace(Sortkey, "")
                End If
                If IsDate(Sortkey) = False then
                    Sortkey = 0
                ElseIf Sortkey = "" then
                    Sortkey = 0
                ElseIf IsNull(Sortkey) = true then
                    Sortkey = 0
                End If
                .AddNew
                .Fields("SortKey").value = CDate(SortKey)
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
    
    
        ElseIf LCase(Arg(1)) = "t" then
        With rs
            .Fields.Append "SortKey", 201, 260 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                .AddNew
                .Fields("SortKey").value = SortKey
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
        ElseIf LCase(Arg(1)) = "tt" then
        With rs
            .Fields.Append "SortKey", 201, 260 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Trim(Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3))))
                .AddNew
                .Fields("SortKey").value = SortKey
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
        End If
    

    To use

    cscript //nologo script.vbs sort {n|d|t|tt} {a|d} startcolumn  endcolumn < input.txt > output.txt
    

    Options

    n - extracts a number from the columns specified. Looks for the first number.
    d - extracts a time or date from the columns specified. Looks for the first date.
    t - extracts a text string including spaces from the columns specified.
    tt - extracts a text string discarding leading and trailing spaces from the columns specified.
    a - sorts acending
    d - sorts decending
    startcolumn - the starting column, the first character is column 1
    endcolumn - the ending column
    

    This is what command line synax means

    The following table describes the notation used to indicate command-line syntax.

    Notation Description

    Text without brackets or braces
     Items you must type as shown
    
    <Text inside angle brackets>
     Placeholder for which you must supply a value
    
    [Text inside square brackets]
     Optional items
    
    {Text inside braces}
     Set of required items; choose one
    
    Vertical bar (|)
     Separator for mutually exclusive items; choose one
    
    Ellipsis (…)
     Items that can be repeated
    
    0 讨论(0)
  • 2020-12-02 03:40

    After much searching, I found the hybrid JScript/batch utility called REPL.BAT the dbenham and got what I wanted, based on my code the script is:

    Del /q "Files\Files.ini">nul 2>&1
    
    for /f "tokens=2 delims=:" %%F in (
      'dir /b /a-d "%location-of-files%\*.*"^|Files\repl "^(\w+).*" "00000$1:$&" a^|Files\repl ".*(\d{5}:)" "$1"^|sort'
    ) do echo %%F >> Files\Files.ini
    
    0 讨论(0)
提交回复
热议问题