Как передать аргументы (не аргументы командной строки) функциям в пакетных сценариях - PullRequest
6 голосов
/ 24 октября 2011

Я пишу командный файл для автоматизации создания типичных структур папок для продуктов, которые мы продаем. Я хотел бы иметь возможность вызывать мой командный файл с 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 ссылается на 1-й аргумент, заданный в командной строке, а не на аргумент, предоставленный в функции :readFile. Как мне этого добиться? Предостережение: я очень новичок в пакетном скриптинге, поэтому вам, возможно, придется поговорить со мной, как будто я немного глуп.

1 Ответ

10 голосов
/ 25 октября 2011

Я перестраиваю файл, и он работает

@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

Но я бы порекомендовал использовать отложенное расширение, так как могут возникнуть проблемы с процентным расширением специальных символов (В этом случае не очень актуально, так как специальныесимволы - плохой выбор для имен файлов / каталогов).

...