我正在尝试创建一个批处理文件,如果它们运行的是Windows XP,则会将文件夹复制到域中的所有计算机。我有这个:
for /f "Tokens=1 delims=$" %a in ('dsquery * domainroot -limit 300 -filter "(&(objectCategory=computer)(operatingSystem=Windows XP*))"^| dsget computer -samid^|find /V "samid" ^| find /V "dsget"') do ( robocopy \\fserver\programs\ "\\%a\C$\Documents and Settings\All Users\Application Data\" /s /R:1 /W:1)c
问题是当我运行它时,在复制到计算机名称之前添加了一个空格。 例如:
Error accessing Destination Directory \\ HP-0D9F\C$\Doc...
我如何摆脱空间?
答案 0 :(得分:1)
如果您稍微更改dsquery
,则可以删除额外的空间。这也消除了必须使用dsget
和额外的find
,因此它似乎运行得更快。此命令将查询所有Windows XP计算机的域,检索每台计算机的“名称”,过滤结果以从输出中删除列标题,并打印每台计算机的名称。
for /f %i in ('dsquery * domainroot -limit 300 -filter "(&(objectcategory=computer)(operatingsystem=Windows XP*))" -attr name ^| find /v /I "name"') do @echo %i
现在,只需在do
之后添加robocopy命令即可将其作为一行命令运行,并避免生成批处理文件。
答案 1 :(得分:0)
您可以删除空间,但这必须跨越不同的行进行,所以实际上您需要在批处理文件中执行此操作
setlocal enabledelayedexpansion
for /f "Tokens=1 delims=$" %%a in ('dsquery * domainroot -limit 300 -filter "(&(objectCategory=computer)(operatingSystem=Windows XP*))"^| dsget computer -samid^|find /V "samid" ^| find /V "dsget"') do (
set pc=%%a
set pc=!pc:\\ =\\!
robocopy \\fserver\programs\ "\\!pc!\C$\Documents and Settings\All Users\Application Data\" /s /R:1 /W:1
)
有可能使用&&
来连接命令,但我还没有做过任何测试,知道它是否适用于延迟扩展,如果你真的想要使用cmd /v:on
它在一条线上。