批处理文件调用函数失败

时间:2015-04-10 08:18:56

标签: windows function file batch-file

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

但无法使其正常工作......

空白的想法,批量编程似乎比网络复杂得多..

@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

1 个答案:

答案 0 :(得分:3)

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

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

资源(必读):

剧本:

@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