在for循环中创建的标记未传递到辅助脚本

时间:2017-04-08 06:39:05

标签: windows batch-file token

我首先要说的是,我对此非常陌生。经过研究,我遇到了很多例子,其中包括比我目前试图做的更复杂的脚本。

此脚本提示用户在调用子脚本时从文件列表中创建/删除/取消用户/组。 (我将使用至少3个总脚本,建议数量为5)

正在读取的文件类似于:(部门偶尔重复,3列)

-

EMPLOYEES

-

  

姓名employeeID部门

     

aaaaa AAAAA Alpha

     

bbbbb BBBBB Beta

     

ccccc CCCCC Omega

     

ddddd DDDDD Beta

ScriptA 如下(顺利运行,子脚本是我的问题 - 我认为)

::This script reads a provided file and creates or deletes users, groups, and folders.
:MENU
CHOICE /C CRX /M "Create or Remove? To cancel, hit X."
REM @ECHO OFF
IF ERRORLEVEL 1 GOTO CREATE
IF ERRORLEVEL 2 GOTO DELETE
IF ERRORLEVEL 3 GOTO END

:CREATE
CALL MakeUsersandGroups.cmd
GOTO END

:DELETE
CALL RemoveUsersandGroups.cmd

:END
ECHO Exiting
PAUSE

脚本B MakeUsersandGroups.cmd如下

@ECHO OFF
SET /P usrfile="Extract names from which file? "

::Make groups

FOR /F "tokens=1-3 skip=4" %%A IN (%usrfile%) DO GOTO GROUP

:GROUP

CALL mkgroup.cmd %%A %%B %%C

脚本B似乎运行顺利,但%% A %% B %% C无法正确转移到被调用的.bat文件。我在课堂上被教导,令牌转换为数字%1%2%3。

到目前为止

脚本C (mkgroup.cmd)如下

::Create users and groups using columns stated by variables in caller script.
:CHECKGROUP
NET LOCALGROUP %3 | FIND /i "%3" > NUL && GOTO GROUPEXISTS
NET LOCALGROUP %3 /ADD

:GROUPEXISTS

GOTO USER
:USER

NET USER | FIND /i "%2" > NUL && GOTO USEREXISTS
NET USER %1 %2 /ADD
NET LOCALGROUP %3 %2 /ADD
GOTO FOLDER

:USEREXISTS
NET LOCALGROUP %3 | FIND /i "%2" > NUL && GOTO FOLDER
NET LOCALGROUP %3 %2 /ADD

:FOLDER
FIND /i "C:/home/%2" > NUL && GOTO CONTINUE
MKDIR C:/home/%2

:CONTINUE

这是我遇到错误的地方。 当它在没有ECHO OFF的情况下运行时,我在cmd中得到以下内容

FOR /F "tokens=1-3 skip=4" %A IN (newhirestest.txt) DO GOTO GROUP
GOTO GROUP
CALL mkgroup.cmd %A %B %C
NET LOCALGROUP     | FIND /i "" 1>NUL && GOTO GROUPEXISTS
NET LOCALGROUP /ADD
The syntax of this command is:

NET LOCALGROUP
[groupname [/COMMENT:"text"]] [/DOMAIN]
               groupname {/ADD [/COMMENT:"text"] | /DELETE} [/DOMAIN]
               groupname name [...] {/ADD | /DELETE} [/DOMAIN]

GOTO USER
NET USER     | FIND /i C 1>NUL && GOTO USEREXISTS
FIND: Parameter format not correct
NET USER B C /ADD

the command completed successfully ::no actually, it made users of my variable names

NET LOCALGROUP C /ADD
The specified local group already exists.

GOTO FOLDER
FIND /i "C:home/C"     1>NUL && GOTO CONTINUE

::infinite type lock, had to ^C, Y to exit

对我来说很明显我的标记/变量没有正确传输,但是我无法弄清楚为什么或如何修复它:基于我在课堂上的笔记,这已经正确完成了。

有两个类似的其他脚本用于删除,它们似乎正在运行而没有错误。

非常感谢任何咨询。

提前谢谢。

3 个答案:

答案 0 :(得分:2)

问题在于MakeUsersandGroups.cmd(脚本B)。

For循环变量仅存在于循环范围内,因此当您使用goto离开循环时,%%A%%B和{{1被销毁,你最终没有传递给mkgroup.cmd。

你可以通过在%%C循环中坚持调用mkgroup.cmd来解决这个问题:

for

答案 1 :(得分:2)

另外,在ScriptA中

IF ERRORLEVEL 1 GOTO CREATE
IF ERRORLEVEL 2 GOTO DELETE
IF ERRORLEVEL 3 GOTO END

必须颠倒。

if errorlevel语法被解释为"如果errorlevel是n 或大于n dothis"因为3正常大于1,所以将采用第一个分支。

IF ERRORLEVEL 3 GOTO END
IF ERRORLEVEL 2 GOTO DELETE
IF ERRORLEVEL 1 GOTO CREATE

应该按预期工作。

答案 2 :(得分:1)

我在这里看到两个问题。

检查从return Response::json(array( "status" => "ok", "message" => "success", )); 命令返回的ERRORLEVEL值的方法是错误的。您可以完全避免一系列CHOICE命令,并在IF命令中直接使用这样的ERRORLEVEL,这是一个更简单的解决方案:

GOTO

另一个问题是您在同一:MENU :OPTION-255 CHOICE /C CRX /M "Create or Remove? To cancel, hit X." GOTO OPTION-%ERRORLEVEL% :OPTION-1 CREATE CALL MakeUsersandGroups.cmd GOTO END :OPTION-2 DELETE CALL RemoveUsersandGroups.cmd :OPTION-3 END :OPTION-0 ECHO Exiting PAUSE 上下文中导出%%A %%B %%C FOR参数,因为FOR命令取消GOTO GROUP。您必须通过FOR命令进行更改。之后,您可以使用一个简单的技巧来获取活动 CALL GROUP命令的令牌:只需使用任何激活另一个FOR(未使用的)令牌:

FOR