如何将参数(不是命令行参数)传递给批处理脚本中的函数

Posted

技术标签:

【中文标题】如何将参数(不是命令行参数)传递给批处理脚本中的函数【英文标题】:How to pass arguments (not command line arguments) to functions within batch scripts 【发布时间】:2011-12-14 05:13:52 【问题描述】:

我正在编写一个批处理文件,用于自动为我们销售的产品创建典型的文件夹结构。我希望能够使用 2 个可选参数调用我的批处理文件;供应商的名称和一次创建大量文件夹的文件。如果未提供供应商,则脚本通过标准输入询问供应商是谁。如果没有提供文件,脚本会询问您要创建的文件夹的名称。如果文件 is 作为参数传递,我希望脚本逐行读取文件并为每一行创建一个文件夹,以该行的内容命名。这是: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 函数中提供的参数。我怎样才能做到这一点?警告:我对批处理脚本非常新手,所以你可能不得不像我有点愚蠢一样跟我说话。

【问题讨论】:

%1 是第一个参数,如果您从命令行获取第一个参数,则可能在您的主代码之后缺少'exit /b'day @jeb:在我看来,这应该是一个答案。我意识到这是一个猜测,但这是一个可能的猜测。即使在 OP 的情况下它被证明是错误的,它仍然应该作为一个可能的答案,供其他人(可能遇到这个问题的人)考虑。 @jeb 对不起,我不明白,exit /b'day 是什么?我知道 $1 是命令行的第一个参数,但据我了解,您在引用函数的第一个参数时也使用 $1。我的问题是如何在不引用第一个命令行参数的情况下访问传递给:makeFolder 的第一个参数? %1 是命令行上的第一个参数,仅在批处理文件的主要部分中。在函数内部,%1 表示该函数的第一个参数。在函数内部,您无法直接访问命令行参数。 我认为您的问题描述有误。我建议你在调用它之前插入一个echo Parameter for makeFolder: %%a,并在makeFolder 的第一行插入一个echo Parameter received %1。这可以帮助您了解正在发生的事情。 【参考方案1】:

我重建了文件并且它工作了

@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

但我建议使用延迟扩展,因为您可能会遇到特殊字符的百分比扩展问题(在这种情况下不太相关,因为特殊字符对于文件/目录名称来说是一个不好的选择)。

【讨论】:

...扩展(什么?) @Birger 好问题,5年后我不记得我想写什么了,所以我不得不猜测

以上是关于如何将参数(不是命令行参数)传递给批处理脚本中的函数的主要内容,如果未能解决你的问题,请参考以下文章

R命令行将文件名传递给参数中的脚本(Windows)

如何通过命令行参数批量执行while循环

shell脚本处理用户输入

shell脚本处理用户输入

shell脚本处理用户输入

如何传递文件中包含的命令行参数并保留该文件的名称?