Batch file 将文件夹复制到域中所有XP计算机的批处理脚本

Batch file 将文件夹复制到域中所有XP计算机的批处理脚本,batch-file,Batch File,我正在尝试创建一个批处理文件,如果域中的所有计算机运行的是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" ^| fin

我正在尝试创建一个批处理文件,如果域中的所有计算机运行的是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...

如何消除空间?

您可以删除空间,但这必须跨单独的行进行,所以实际上您需要在批处理文件中执行此操作

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

您可以删除空间,但这必须跨单独的行执行,实际上,您需要在批处理文件中执行此操作

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

如果您稍微更改
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
之后添加robocy命令,就可以将其作为一行命令运行,避免生成批处理文件。

如果稍微更改
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命令,就可以将其作为一行命令运行,避免生成批处理文件。

它仍然包含空间。它仍然包含空间。