我需要将 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
我需要将 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
使用 vbscript 肯定没有错:-) (请参阅OP 的回答)
但我想我会指出你的批处理代码哪里出错了。
.
将包括父目录。相反,您只想*
得到孩子。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"
刚刚用 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