在批处理调用目录中进行批处理并在标签之间跳转

batch within batch call directories and jumping between labels

我有一个 .bat,它是一个包含多个选项的大菜单。

每个选项调用一个不同的批处理文件,该文件位于子文件夹“/scripts”下的同一目录中。

我通过删除所有目录路径使每个单独的脚本都通用。如何在主菜单脚本中发送这些脚本应该在哪里工作的方向?


好的,这是一些代码。

这是我的main.bat

的缩小版
@echo off
cls
SET "scriptdir=z:\scripts"
SET "workdir=c:\Users\%username%\Desktop\test"

:start
echo Clean And Rename Test V2.0.1
echo.
echo 1. Root Directory Only
echo 2. Root And Subfolders
echo.
echo 3. None, Exit...
echo.
set /p menu0=...1,2,3?
if '%menu0%'=='1' CALL :root.only
if '%menu0%'=='2' CALL :root.only&CALL:root.with.subs
if '%menu0%'=='3' CALL :end2
goto start

:root.only
echo Deleting Junk Files
CALL %scriptdir%-test-root-delete-junk.bat %workdir%
echo.
echo Cleaning File Names
CALL %scriptdir%-test-root-clean-names.bat %workdir%
echo.
echo Setting Letter Case
CALL %scriptdir%-test-root-letter-case.bat %workdir%
echo.
goto :end

:root.with.subs
echo Deleting Junk Files
CALL %scriptdir%-test-subs-delete-junk.bat %workdir%
echo.
echo Cleaning File Names
CALL %scriptdir%-test-subs-clean-names.bat %workdir%
echo.
echo Setting Letter Case
CALL %scriptdir%-test-subs-letter-case-.bat %workdir%
echo.
goto :end

:end
echo Actions Complete
echo.
pause
exit

:end2
exit

这是其中一个脚本。

@ECHO OFF
PUSHD "%~dp0"
setlocal EnableDelayedExpansion

REM Cleanup Dots/Underscores
for %%j in (*.*) do (
   set filename=%%~nj
      set filename=!filename:.= !
      set filename=!filename:_= !
      set filename=!filename:[=!
      set filename=!filename:]=!
if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj"
)

REM Set All To Lowercase
for %%f in (*.*) do (
   set "filename=%%~Nf"
   for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
      set "filename=!filename:%%a=%%a!"
   )

REM Set Very First To Uppercase   
   set "letter=!filename:~0,1!"
for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
      set "letter=!letter:%%A=%%A!"
   )
   ren "%%f" "!letter!!filename:~1!%%~Xf"
)

REM Setting Title Case
for %%j in (*.*) do (
set filename=%%~nj
set filename=!filename: a= A!
set filename=!filename: b= B!
set filename=!filename: c= C!
set filename=!filename: d= D!
set filename=!filename: e= E!
set filename=!filename: f= F!
set filename=!filename: g= G!
set filename=!filename: h= H!
set filename=!filename: i= I!
set filename=!filename: j= J!
set filename=!filename: k= K!
set filename=!filename: l= L!
set filename=!filename: m= M!
set filename=!filename: n= N!
set filename=!filename: o= O!
set filename=!filename: p= P!
set filename=!filename: q= Q!
set filename=!filename: r= R!
set filename=!filename: s= S!
set filename=!filename: t= T!
set filename=!filename: u= U!
set filename=!filename: v= V!
set filename=!filename: w= W!
set filename=!filename: x= X!
set filename=!filename: y= Y!
set filename=!filename: z= Z!
if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj"
)
popd

基本上我想做的是将所有脚本放在 z:\scripts 中。然后将我的 main.bat 的多个版本放在不同的地方。我将重命名 main.bat 用于它的特定任务,我希望 main.bat 调用脚本并告诉它们在哪里工作,如果需要则按顺序。

我使用了一个 bat 来执行编译器,这很好使它工作得很好,在完成编辑和构建的所有内容结束时可能会很有用。

我是新手。我现在这样做的愿望是学习和组织。我想写一个脚本并且知道它可以完美运行并存储它。在完成主文件中的所有工作以控制事物时。这样,如果出现问题,我知道它与主文件有关,而不是在数百行脚本中也可能意外出错的东西。 想法?

您可以简单地调用您的 bat 文件并将路径传递到目标目录:

在你的主球棒中:

...
call sub-bat.bat c:\folder\subfolder\folderToDoWorkIn\
...

在你的子蝙蝠中:

...
SET targetFolder=%1
...

每个单独的批处理文件都可以通过此命令设置其工作所需的目录:

cd "%~dp0"

... 或使用类似于 "sourcedir" 的变量,在菜单批处理文件中以相同的方式设置。

如果单个批处理文件有一个 setlocal 命令,只需将上一行放在它后面即可。当每个单独的文件结束时,该目录将自动重置为原始目录。

如果批处理文件没有setlocal命令,您可以将目录设置为

开头
pushd "%~dp0"

...并在结束使用前重置原始目录

popd

这样你就不需要修改主批处理文件,单个文件可以放在任何目录中;例如,在 PATH 变量中包含的目录中。