【问题标题】:Is there a way I can loop an input until dsquery is successful?有没有办法可以循环输入直到 dsquery 成功?
【发布时间】:2019-08-24 09:00:09
【问题描述】:

如果 dsget 不成功,我正在尝试找出一种方法让我的批处理文件重复一个问题。

这是我目前拥有的:

@echo off
set /p input="Enter AD Username to lookup: "
dsquery user -samid %input% |dsget user -memberof |dsget group -samid |find /v "samid"|findstr /v "dsget%" | clip | echo User found & echo.Groups copied to clipboard
pause

它将用户活动目录组复制到剪贴板,但如果不成功,您必须重新打开批处理文件,我不希望发生这种情况。

基本上,如果 dsquery 未能成功找到用户,我希望它说类似

User not found
Enter an AD Username to lookup:

只有在成功的情况下,它才会剪切 dsquery 的内容

【问题讨论】:

    标签: batch-file command-line active-directory


    【解决方案1】:

    我没有 dsquery 或 dsget,所以我无法对此进行测试。

    one-line conditional execution in windows1one-line conditional execution in windows2

    command1 && command2 || command3
    

    仅当 command1 成功时才执行 command2。如果 command1 失败,则执行 command3。

    if %errorlevel% neq 0

    @echo off
    :loop 
    set /p input="Enter AD Username to lookup: "
    REM Since I can't test it this is a 51/49 guess
    REM MAYBE?
    dsquery user -samid %input% | dsget user -memberof | dsget group -samid  | FIND /i "dsget failed" > NUL && goto :loop || clip
    REM dsquery user -samid %input% | dsget user -memberof | dsget group -samid | FINDSTR /i /c:"dsget failed">NUL | clip
    REM IF %ERRORLEVEL% NEQ 0 goto :loop
    echo User found. Groups copied to clipboard.
    pause 
    exit
    

    【讨论】:

    • 不幸的是,无论用户是否存在,该命令仍会被解析。你知道我怎么能找到一个有条件的来抵消这个吗?像 IF [dsquery 的结果] 有字符串 [dsget failed] 然后转到循环?
    • 我没有 dsquery,所以我无法测试我给你的任何东西。 | dsget group -samid | FINDSTR /i /n /c:"dsget failed">NUL && goto :loop
    • 构造 findstr /v "dsget%" && | clip || goto :loop echo User found. Groups copied to clipboard. 不能工作,这是错误的语法。任何&&/||对上一条命令的退出码有反应,与ErrorLevel的值不一样;所以我相信这里最好在dsquery 行之后加上if not ErrorLevel 1 goto :loop...
    • @aschipfl 这是错的吗? if errorlevel 1 echo Previous command most likely exited with an error code.if not errorlevel 1 echo Previous command most likely finished successfully.
    • 这似乎是正确的。注意if ErrorLevel 1实际上表示如果ErrorLevel大于或等于1if not ErrorLevel 1表示如果ErrorLevel小于1,所以负值(尽管很少见)可能会被错误地对待。无论如何,我不知道dsquery 是否修改了ErrorLevel 以及如何...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2015-05-15
    相关资源
    最近更新 更多