我首先要说的是,我对此非常陌生。经过研究,我遇到了很多例子,其中包括比我目前试图做的更复杂的脚本。
此脚本提示用户在调用子脚本时从文件列表中创建/删除/取消用户/组。 (我将使用至少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
对我来说很明显我的标记/变量没有正确传输,但是我无法弄清楚为什么或如何修复它:基于我在课堂上的笔记,这已经正确完成了。
有两个类似的其他脚本用于删除,它们似乎正在运行而没有错误。
非常感谢任何咨询。
提前谢谢。
答案 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