我需要将test.swf复制到c:/ test文件夹中不包含“git”字的所有子文件夹
尝试了类似的东西但没有效果
@setlocal enableextensions enabledelayedexpansion
@echo off
for /r %%a in (.) do
(
if not x%a:git=%==x%a% do
(
@copy "C:\test.swf" %a > nul
)
)
endlocal
答案 0 :(得分:5)
使用vbscript肯定没有问题:-) (见OP's answer)
但我想我会指出您的批处理代码出错的地方。
.
将包含父目录。您希望*
代替孩子。C:\test\_git_\test
之类的路径应该获取该文件,因为文件夹名称不包含" git" (虽然父母这样做)。你的代码会在路径的任何地方寻找git。其他改进点,但不是错误:
@echo off
置于顶部,然后使用@
为每个命令添加前缀。以下是您的算法的正确代码。 (实际上下面的代码解决方案都没有经过测试,但我认为我认为它们是正确的)
@echo off
setlocal enableDelayedExpansion
for /d /r "c:\test" %%F in (*) do (
set "name=%%~nxF"
if "!name:git=!" neq "!name!" copy "c:\test.swf" "%%F" >nul
)
以上通常有效。但如果文件夹名称包含!
,则会失败,因为延迟扩展会破坏%% F的扩展。解决方案是在循环内打开和关闭延迟扩展。
@echo off
setlocal disableDelayedExpansion
for /d /r "c:\test" %%F in (*) do (
set "name=%%~nxF"
setlocal enableDelayedExpansion
if "!name:git=!" neq "!name!" (
endlocal
copy "c:\test.swf" "%%F" >nul
) else endlocal
)
但是有一种更简单的方法。您可以使用正则表达式将DIR的结果传递给FINDSTR,该正则表达式将使用" git"过滤掉文件夹。在名字里。然后使用FOR / F处理结果。
编辑 - 我简化了正则表达式。
@echo off
for /f "delims=" %%F in (
'dir /ad /s /b "c:\test\*" ^| findstr /virc:"git[^\\]*$"'
) do copy "c:\test.swf" "%%F"
整个过程可以在命令行的一行上完成
for /f "delims=" %F in ('dir /ad /s /b "c:\test\*" ^| findstr /virc:"git[^\\]*$"') do @copy "c:\test.swf" "%F"
答案 1 :(得分:1)
刚刚通过vbscript
做到了Const SourceDir = "C:\source"
Const TargetDir = "C:\target\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(TargetDir)
Set colSubfolders = objFolder.Subfolders
Set dosyalarklasor = objFSO.GetFolder(SourceDir)
Set dosyalar = dosyalarklasor.Files
For Each objSubfolder in colSubfolders
if not instr(objSubfolder.Name,".git") > 0 then
For Each dosya in dosyalar
objFSO.CopyFile dosya, TargetDir & objSubfolder.Name & "\"
Next
end if
Next