【问题标题】:batch file calling to function fail批处理文件调用函数失败
【发布时间】:2015-04-10 08:18:56
【问题描述】:

一直试图弄清楚如何将随机字符串生成作为一个函数,然后调用函数为每个 for 循环返回新的随机字符串。

但无法让它工作......

空白的想法,批处理编程似乎比 web 复杂得多..

@echo off

GOTO :MAIN

:TestFunc

    set orig=%1
    set %~2=%random%

goto :eof


:MAIN

    for %%a in (C:\folder\*.png) do (

        set /a count+=1
        set "fname=%%~a"
        setlocal enabledelayedexpansion

        set param_to_function=LetItBeA
        call :TestFunc %param_to_function% return_value
        set random=%return_value%
        echo !random!

        echo !fname!

        ren "!fname!" img_%date:~10,4%-%date:~4,2%-%date:~7,2%_%HR%%time:~3,2%-!random!.png

        endlocal
    )

goto :eof

【问题讨论】:

    标签: windows function file batch-file


    【解决方案1】:

    原始问题已回答(编辑前)。说明:

    • for /F 用于dir /bfor /F 不同,for 立即开始解析文件,因此它可以一次又一次地获得重命名的文件...
    • 在子例程中处理文件重命名,并在 ren 之前测试文件是否存在。
    • 注意endlocal&set "%1=%_RndAlphaNum%"&goto :eof 棘手的部分如何将值返回给通过引用传递的变量(参数)。
    • ren 命令 echoed 仅用于调试目的。

    资源(必读):

    脚本:

    @ECHO OFF
    SETLOCAL enableextensions disabledelayedexpansion
    Set /A "_RNDLength=6"
    Set "_Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    
    set "_folder=C:\folder"
    for /F "delims=" %%a in ('dir /B "%_folder%\*.png"') do (
        set /a count+=1
        set "fname=%%~nxa"
        call :renameFile
    )
    ENDLOCAL
    goto :eof
    
    :renameFile
    call :getRandomString _RndANum
    set "newFileName=img_%date:~10,4%-%date:~4,2%-%date:~7,2%_%HR%%time:~3,2%-%_RndANum%.png"
    if exist "%_folder%\%newFileName%" goto :renameFile
    echo ren "%_folder%\%fname%" "%newFileName%"
    goto :eof
    
    :getRandomString
    rem usage
    rem call :getRandomString varname
    rem %1 = a variable name (pass by reference)
    Setlocal EnableDelayedExpansion
    Set "_Str=%_Alphanumeric%987654321"
    :_LenLoop
    IF NOT "%_Str:~18%"=="" (
      SET _Str=%_Str:~9%
      SET /A "_Len+=9"
      GOTO :_LenLoop
    )
    SET _tmp=%_Str:~9,1%
    SET /A _Len=_Len+_tmp
    Set _count=0
    SET _RndAlphaNum=
    :_loop
    Set /a _count+=1
    SET _RND=%Random%
    Set /A _RND=_RND%%%_Len%
    SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
    If !_count! lss %_RNDLength% goto _loop
    rem do not split next line
    endlocal&set "%1=%_RndAlphaNum%"&goto :eof
    

    【讨论】:

    • 感谢您提供的资源,您真是个天才,这解决了我的噩梦和对我的问题的想法。
    • echo ren "%_folder%\%fname%" "%newFileName%":在调试之前删除前导echo...
    • 是的,我发截图给你后发现了echo,应该已经很清楚了。你太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多