【问题标题】:batch within batch call directories and jumping between labels在批处理调用目录中批处理并在标签之间跳转
【发布时间】:2015-03-25 08:22:51
【问题描述】:

我有一个 .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%\01-test-root-delete-junk.bat %workdir%
echo.
echo Cleaning File Names
CALL %scriptdir%\02-test-root-clean-names.bat %workdir%
echo.
echo Setting Letter Case
CALL %scriptdir%\03-test-root-letter-case.bat %workdir%
echo.
goto :end

:root.with.subs
echo Deleting Junk Files
CALL %scriptdir%\10-test-subs-delete-junk.bat %workdir%
echo.
echo Cleaning File Names
CALL %scriptdir%\11-test-subs-clean-names.bat %workdir%
echo.
echo Setting Letter Case
CALL %scriptdir%\12-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 to exe 编译器,这很好,使它工作得很好,也许在完成编辑和构建后的所有工作结束时很有用。

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

【问题讨论】:

  • 又尝试了一些方法,但无济于事。只是对这部分有点困惑。
  • 我已经评论了我的答案 ;-)

标签: batch-file menu path directory call


【解决方案1】:

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

cd "%~dp0"

...或者使用类似“sourcedir”的变量在菜单Batch file中设置的方式相同。

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

如果批处理文件没有setlocal命令,你可以设置目录以开头

pushd "%~dp0"

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

popd

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

【讨论】:

    【解决方案2】:

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

    在你的主球棒中:

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

    在您的子蝙蝠中:

    ...
    SET targetFolder=%1
    ...
    

    【讨论】:

    • 我一定是做错了什么。这有效,但仅适用于第一个 bat 脚本。我能够让它们按顺序运行的唯一方法是将所有文件放在工作文件夹中并从每个文件中删除路径。
    • 我不明白。您正在将 %workdir% 传递给您的 bat 文件,但在您调用的 bat 中您正在执行 PUSHD "%~dp0"?您应该将其替换为 CD %workdir%。顺便说一句,我们使用CALL 启动一个子bat 文件(您也可以使用START,但这不起作用)您的调用bat 可以完全访问主bat 中设置的任何变量。因此,如果您在主球棒中执行SET workdir=c:\Users\%username%\Desktop\test,则不必将此变量传递给使用CALL 调用的其他球棒。您可以在您的子蝙蝠中将其用作%workdir%
    • 太棒了,它完全有效。哈哈,这么简单的事情。谢谢人:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2021-11-08
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多