Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何将参数(不是命令行参数)传递给批处理脚本中的函数_Batch File_Command Line Arguments_Argument Passing - Fatal编程技术网

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

Batch file 如何将参数(不是命令行参数)传递给批处理脚本中的函数,batch-file,command-line-arguments,argument-passing,Batch File,Command Line Arguments,Argument Passing,我正在编写一个批处理文件,用于为我们销售的产品自动创建典型的文件夹结构。我希望能够使用2个可选参数调用我的批处理文件;供应商的名称和一个用于同时创建多个文件夹的文件。如果未提供供应商,脚本将通过标准输入询问供应商是谁。如果未提供任何文件,脚本将询问要创建的文件夹的名称。如果文件作为参数传递,我希望脚本逐行读取文件,并为每行创建一个文件夹,以该行内容命名。以下是:readFile函数: :readFile echo "Reading from file: %theFile%" FO

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

我重建了文件,它成功了

@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

但我建议使用延迟扩展,因为特殊字符的扩展百分比可能会出现问题(在本例中,不太相关,因为对于文件/目录名来说,特殊字符是一个错误的选择)

%1是第一个参数,如果从命令行获取第一个参数,则可能在主参数之后缺少“退出/b”日code@jeb当前位置在我看来,这应该是一个答案。我意识到这是一个猜测,但这是一个可能的猜测。即使在OP的情况下结果是错误的,它仍然应该作为一个可能的答案,对于其他人(可能会遇到这个问题的人)考虑。@ Jeb对不起,我不明白,什么是<代码>退出/ B'Tays<代码>?我知道$1是命令行中的第一个参数,但据我所知,在引用函数的第一个参数时也使用$1。我的问题是如何访问传递给
:makeFolder
的第一个参数而不引用第一个命令行参数?
%1
是命令行上的第一个参数,仅在批处理文件的主要部分。在函数中,
%1
表示该函数的第一个参数。在函数中,您无法直接访问命令行的参数。我认为您的问题描述是错误的。我建议您在调用makeFolder之前插入一个
echo参数:%%a
,并在makeFolder的第一行插入一个
echo参数%1
。这可能有助于你了解正在发生的事情。。。。(什么?)@Birger的扩展很好的问题,5年后我记不起我想写什么,所以我不得不猜测