1

我试图创建一个批处理文件,如果它们正在运行 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...

我如何摆脱空间?

4

2 回答 2

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

现在,只需在您可以将其作为单行命令运行之后添加您的 robocopy 命令,do而不必制作批处理文件。

于 2014-02-07T15:51:45.080 回答
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
)

可能可以使用&&'s 连接命令,但我还没有进行任何测试以了解它是否适​​用于延迟扩展,cmd /v:on如果你真的想在一行上使用它,可以考虑使用。

于 2013-02-01T09:49:30.130 回答