在多个Windows Server子目录中运行特定程序

问题描述

我们遇到一种情况,需要在多个子目录中运行相同的命令行程序。我们的命令行程序旨在启动/停止服务器上的特定进程。 当前,我需要手动访问这些文件夹并在其中运行程序,但这非常不方便且耗时。为了节省时间,我创建了原始cmd,它将为我完成此操作,但是有可能存在更多这样的情况,其中包含六个以上的子文件夹。 我们的程序具有不同类型的命令行参数,例如:start,stop,log等。

echo "Stopping program..."

echo "Stopping p1..."
cd folder1
g stop
echo "done"

cd ..

echo "Stopping p2..."
cd folder2
g stop
echo "done"

cd ..

echo "Stopping p3..."
cd folder3
g stop
echo "done"

cd ..

echo "Stopping p4..."
cd folder4
g stop
echo "done"

cd ..

echo "Stopping p5..."
cd folder5
g stop
echo "done"

cd..

echo "Stopping p6..."
cd folder6 
g stop
echo "done"

cd ..

echo "Stopping p7..."
cd folder7
g stop
echo "done"

cd ..

这是我想出的,但是它很丑陋,也不是很聪明。我想要的解决方案是这样的,

D:\rootForMyFolders>helper start *
D:\rootForMyFolders>helper stop *

或仅指定将在其中执行该程序的文件夹的名称,例如:

D:\rootForMyFolders>helper start folder1 folder2 folder3

我正在调查FOR /R。您有什么想法,如何安全可靠地做到这一点?任何帮助将非常感激。谢谢。

解决方法

通常,您最好放置程序的完整位置以运行,而不要CD到路径。

因此在第一个示例中,它看起来像:

@(SETLOCAL
  ECHO OFF
)

CALL :Main

( ENDLOCAL
  EXIT/B
)

:Main
  echo "Stopping program..."

  echo "Stopping p1..."
  "D:\rootForMyFolders\folder1\g" stop
  echo "done"

  echo "Stopping p2..."
  "D:\rootForMyFolders\folder2\g" stop
  echo "done"

  REM p3,p4,..etc.
GOTO :EOF

然后,我们要对某些重复项进行重复数据删除,但您的手动列表仍然容易很多:

@(SETLOCAL
  ECHO OFF
  SET "_RootFolder=D:\rootForMyFolders"
  SET "_SubFolders="Folder1" "Folder2" "Folder3" "Folder4" "Folder5" "Folder6" "Folder7" "
  SET "_CMD=g"
  SET "_Action=Stop"
)

CALL :Main

( ENDLOCAL
  EXIT/B
)

:Main
  ECHO.%_Action% programs...

  REM Loop folders runnign the stop command in each:
  FOR %%_ IN ( %_SubFolders% ) DO (
    ECHO.Running %_\%_CMD=% %_Action%...
    "%_RootFolder%\%%_\%_CMD=%" %_Action%
    ECHO.done
  )

  ECHO.Script Completed!

现在,我们将其转换为重构形式,可以轻松地编辑变量并循环访问它们,您已经节省了很多时间,因为我们迭代开发一个程序,可以在其中指定所需的变量。在CLI中。


保留用于后续步骤