批处理文件:For /F Loop with Dsget only returns 第二行而不是第一行
BATCH File: For /F Loop with Dsget only returns the second line and not the first line
setlocal ENABLEDELAYEDEXPANSION
For /F "tokens=1" %%g in ('cmd /c whoami') do (set loggedinusername=%%g)
set loggedinusername=%loggedinusername:~6%
echo %loggedinusername%
For /F "Tokens=1 eol==" %%a in ('dsquery user -samid %loggedinusername% ^|dsget user -dept ^|find /V "dept"') do (set deptname=%%a)
echo deptname equals %deptname%
我希望有人可以看看这一点批处理代码并告诉我我哪里出错了。第一部分获取用户名工作正常,它在第二个 FOR /F.
中成功使用变量
但是,正如您在下面的输出中看到的那样,它确实成功找到了部门名称,但是当我输出变量时它只是 returns dsget 成功消息而不是上面的行。
非常感谢任何帮助或建议,干杯
C:\Users\*****\Desktop>for /F "Tokens=1 eol==" %a in ('dsquery user -samid USERNAME |dsget user -dept |find /V "dept"') do (set deptname=%a )
C:\Users\*****\Desktop>(set deptname=IT )
C:\Users\*****\Desktop>(set deptname=dsget )
C:\Users\*****\Desktop>echo deptname equals dsget
deptname equals dsget`
您可以使用许多选项,但是由于我无法使用这些命令,也无法查看您收到的实际输出,因此您必须使用或改编以下示例之一。
如果您知道部门名称永远不会以字符 d
开头,您可以只使用:
For /F "EOL=d Delims=" %%G In ('dsquery user -samid USERNAME ^| dsget user -dept') Do Set "deptname=%%G"
但是,如果部门名称可以以 d
开头,您可以使用额外的 find
命令:
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| find /v "dept" ^| find /v "dsget"') Do Set "deptname=%%G"
或改用findstr
命令:
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| findstr /v "dept dsget"') Do Set "deptname=%%G"
或者你可以使用我在评论部分提供的想法:
Set "deptname="
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| find /v "dept"') Do If Not Defined deptname Set "deptname=%%G"
其他可能的替代方案可能包括:
如果第一行总是dept:
For /F Skip^=1^ Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept') Do Set "deptname=%%G" & GoTo Next
:Next
如果第一行是空白,第二行是dept
,那么把Skip^=1^
改成Skip^=2^
如果您知道所有部门名称,那么您也可以将它们放在 findstr
匹配项中:
Set "depts=Design Finance IT Workshop"
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| findstr /i "%depts%"') Do Set "deptname=%%G"
setlocal ENABLEDELAYEDEXPANSION
For /F "tokens=1" %%g in ('cmd /c whoami') do (set loggedinusername=%%g)
set loggedinusername=%loggedinusername:~6%
echo %loggedinusername%
For /F "Tokens=1 eol==" %%a in ('dsquery user -samid %loggedinusername% ^|dsget user -dept ^|find /V "dept"') do (set deptname=%%a)
echo deptname equals %deptname%
我希望有人可以看看这一点批处理代码并告诉我我哪里出错了。第一部分获取用户名工作正常,它在第二个 FOR /F.
中成功使用变量但是,正如您在下面的输出中看到的那样,它确实成功找到了部门名称,但是当我输出变量时它只是 returns dsget 成功消息而不是上面的行。
非常感谢任何帮助或建议,干杯
C:\Users\*****\Desktop>for /F "Tokens=1 eol==" %a in ('dsquery user -samid USERNAME |dsget user -dept |find /V "dept"') do (set deptname=%a )
C:\Users\*****\Desktop>(set deptname=IT )
C:\Users\*****\Desktop>(set deptname=dsget )
C:\Users\*****\Desktop>echo deptname equals dsget
deptname equals dsget`
您可以使用许多选项,但是由于我无法使用这些命令,也无法查看您收到的实际输出,因此您必须使用或改编以下示例之一。
如果您知道部门名称永远不会以字符 d
开头,您可以只使用:
For /F "EOL=d Delims=" %%G In ('dsquery user -samid USERNAME ^| dsget user -dept') Do Set "deptname=%%G"
但是,如果部门名称可以以 d
开头,您可以使用额外的 find
命令:
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| find /v "dept" ^| find /v "dsget"') Do Set "deptname=%%G"
或改用findstr
命令:
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| findstr /v "dept dsget"') Do Set "deptname=%%G"
或者你可以使用我在评论部分提供的想法:
Set "deptname="
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| find /v "dept"') Do If Not Defined deptname Set "deptname=%%G"
其他可能的替代方案可能包括:
如果第一行总是dept:
For /F Skip^=1^ Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept') Do Set "deptname=%%G" & GoTo Next
:Next
如果第一行是空白,第二行是dept
,那么把Skip^=1^
改成Skip^=2^
如果您知道所有部门名称,那么您也可以将它们放在 findstr
匹配项中:
Set "depts=Design Finance IT Workshop"
For /F Delims^=^ EOL^= %%G In ('dsquery user -samid USERNAME ^| dsget user -dept ^| findstr /i "%depts%"') Do Set "deptname=%%G"