Вызов функции / скрипта из другого экземпляра самого себя - PullRequest
0 голосов
/ 01 апреля 2019

например, этот скрипт:

t.cmd

@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"


set pafIf=%~dp0
call :fIsc "!pafIf:~0,-1!"
goto fIn
:fIsc
set "pafIfZs=%1"
set pafIfZs=!pafIfZs:"=!
for /F "tokens=* delims=" %%q in ('dir "!pafIfZs!" /b') do (
    echo "!pafIfZs!\%%q\"
    if exist "!pafIfZs!\%%q\" (
        call :fIsc "!pafIfZs!\%%q"
    ) else (
        call :fIsc1 "!pafIfZs!\%%q"
    )
)
goto :eof
:fIsc1
    echo 1 %1
goto :eof
:fIn


:scIn
rem endlocal
pause
rem exit /b

должен взаимодействовать с каждым файлом / папкой в ​​его родительской папке и каждой подпапкой, и указывать пути к каждому элементу, 2 раза для файлов, но запускать его с:

E:\t t\
__ t.cmd
__ t1\
__ __ t1.txt
__ __ t2\
__ __ __ t2.txt
__ t3\
__ __ t3.txt

дерево, дает такой вывод:

"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t3\"
1 "E:\t t\t1\t2\t3"

почему

1 Ответ

1 голос
/ 01 апреля 2019
@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"


set pafIf=%~dp0
call :fIsc "!pafIf:~0,-1!"
goto fIn
:fIsc
setlocal
set "pafIfZs=%1"
set pafIfZs=!pafIfZs:"=!
for /F "tokens=* delims=" %%q in ('dir "!pafIfZs!" /b') do (
    echo "!pafIfZs!\%%q\"
    if exist "!pafIfZs!\%%q\" (
        call :fIsc "!pafIfZs!\%%q"
    ) else (
        call :fIsc1 "!pafIfZs!\%%q"
    )
)
goto :eof
:fIsc1
    echo 1 %1
goto :eof
:fIn


:scIn
rem endlocal
pause
rem exit /b

В образовательных целях, как for /r или dir /s /b может делать рекурсию.

Этот код будет проходить полный путь по мере его повторения.

Добавлено setlocal для сохранения локальных переменных для каждой рекурсии call. Без setlocal, !pafIfZs! может быть изменено и один раз рекурсивно call возвращает, цикл for продолжается с измененным !pafIfZs! это недействительно для текущего call.

Вывод с setlocal:

"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t1.txt\"
1 "E:\t t\t1\t1.txt"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t2.txt\"
1 "E:\t t\t1\t2\t2.txt"
"E:\t t\t3\"
"E:\t t\t3\t3.txt\"
1 "E:\t t\t3\t3.txt"
Press any key to continue . . .

Вывод без setlocal:

"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t1.txt\"
1 "E:\t t\t1\t1.txt"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t2.txt\"
1 "E:\t t\t1\t2\t2.txt"
"E:\t t\t1\t2\t3\"
1 "E:\t t\t1\t2\t3"
Press any key to continue . . .

Ток tree:

E:\T T
|   t.cmd
|
+---t1
|   |   t1.txt
|   |
|   \---t2
|           t2.txt
|
\---t3
        t3.txt

Модификатор для f в %%~fq может генерировать неверные пути, пока рекурсивный, так как текущий каталог не меняется и только имя ( включая расширение ) предоставляется с dir /b. Только с именем, ожидайте, что модификатор будет предшествовать текущий каталог с именем.

Пример модификации, если текущий каталог отличается:

@echo off
setlocal
cd /d "D:\t t"

for /f "delims=" %%q in ('dir /b') do (
    cd /d "E:\"
    echo %%~fq
    if exist "%%~fq" (echo Valid) else echo Invalid
    echo(
)

Выход:

D:\t t\t.cmd
Valid

E:\t1
Invalid

E:\t2
Invalid

E:\t3
Invalid

Это показывает, что полный путь %%~fq построен из текущего каталога, так как %%q не является действительным полным Путь для начала и просто либо имя файла или имя папки. Вот почему for /r и dir /b /s предоставляют полные пути вместо просто имени файла или имени папки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...