如何在批处理脚本中向函数传递参数(非命令行参数)

10

我正在编写一个批处理文件,用于自动创建销售产品的典型文件夹结构。我希望能够使用两个可选参数调用我的批处理文件:供应商名称和一次性创建许多文件夹的文件。如果未提供供应商,则脚本会通过标准输入询问供应商是谁。如果未提供文件,则脚本会要求您输入要创建的文件夹的名称。如果作为参数传递了文件,我希望脚本逐行读取该文件,并为每一行创建一个以该行内容命名的文件夹。这里是:readFile函数的代码:

:readFile
    echo "Reading from file: %theFile%"
    FOR /F "delims=," %%a IN (%theFile%) do (
        call:makeFolder %%a
    )
    goto:EOF

这是一个:makeFolder函数,可选地接受要创建的文件夹名称作为参数。如果未提供参数,则通过标准输入请求名称。

:makeFolder  
    if [%1]==[] (
        set /p product="Enter product name: "
    ) else (
        set product=%1
    )
    if exist "P:\%supplier%\Products\%product%" (
        echo.
        echo The folder '%product%' already exists.
        echo.
        goto:EOF
    )
    mkdir "P:\%supplier%\Products\%product%\Images\Web Ready"
    mkdir "P:\%supplier%\Products\%product%\Images\Supplied"
    mkdir "P:\%supplier%\Products\%product%\Images\Edited"
    goto:EOF

我的问题是在:makeFolder函数中,%1指的是命令行中给出的第一个参数,而不是在:readFile函数中提供的参数。我该如何解决这个问题?注意:我对批处理脚本非常陌生,所以你可能需要像对待有点傻的人一样和我交流。


5
%1是第一个参数,如果你从命令行获取了第一个参数,那么在主代码之后可能会缺少一个"exit /b"语句。 - jeb
@jeb,很抱歉我不明白 exit /b'day 是什么意思。我知道 $1 是命令行传入的第一个参数,但我也知道在引用函数的第一个参数时也会使用 $1。我的问题是如何访问传递给 :makeFolder 的第一个参数而不引用第一个命令行参数。 - punkrockbuddyholly
我认为你的问题描述有误。建议在调用makeFolder之前插入echo Parameter for makeFolder: %%a,并在makeFolder的第一行插入echo Parameter received %1。这样可以帮助你看清发生了什么。 - Aacini
@MrMisterMan :-) “exit /b” 的那个“day”只是我的手机的一个错误,应该读作“exit /b”。 - jeb
@jeb 哈哈!我想这一定是个打字错误。顺便说一下,你们都是对的。非常感谢你们的帮助。 - punkrockbuddyholly
显示剩余2条评论
1个回答

14

我重新构建了文件,然后它就能工作了

@echo off
set "supplier=C:\temp\supp\"
set "product=Car"
echo test1,myComment,myValue > myFile.txt
call :readFile "myFile.txt"
EXIT /B

:readFile
echo "Reading from file: %~1"
FOR /F "usebackq delims=," %%a IN ("%~1") do (
    call :makeFolder %%a
)
goto:EOF

:makeFolder  
if "%1"=="" (
    set /p product="Enter product name: "
) else (
    set "product=%1"
)
if exist "%supplier%\Products\%product%" (
    echo(
    echo The folder '%product%' already exists.
    echo(
    goto:EOF
)
echo "%1"
echo mkdir "%supplier%\Products\%product%\Images\Web Ready"
echo mkdir "%supplier%\Products\%product%\Images\Supplied"
echo mkdir "%supplier%\Products\%product%\Images\Edited"
goto:EOF

不过我建议使用延迟扩展,因为百分号特殊字符的扩展可能会出现问题(在这种情况下并不是很重要,因为特殊字符对于文件名/目录名来说并不是一个好的选择)。


...扩展(什么的扩展?) - birgersp
1
@Birger 很好的问题,5年后我已经记不清我想写什么了,所以只能猜了。 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接