0

我需要将 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
4

2 回答 2

5

使用 vbscript 肯定没有错:-) (请参阅OP 的回答

但我想我会指出你的批处理代码哪里出错了。

  • 左括号必须与 IF 或 DO 在同一行,并且前面必须有一个空格。
  • DO 不与 IF 一起使用
  • 您还需要 FOR /D 选项与 /R 一起使用。没有它,您将获得文件而不是目录。
  • .将包括父目录。相反,您只想*得到孩子。
  • 我不确定您的要求,但我假设路径C:\test\_git_\test应该获取文件,因为文件夹名称不包含“git”(尽管父级包含)。您的代码将在路径中的任何位置查找 git。
  • 在批处理文件中,所有 FOR 变量都必须用双百分号引用,如 %%a 中所示。你不一致。
  • 您不能对 FOR 变量执行搜索和替换,只能对环境变量执行搜索和替换。

其他改进点,但不是错误:

  • 很少需要 enableExtensions。默认情况下启用。
  • 最好放在@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"
于 2012-07-29T03:02:25.520 回答
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
于 2012-07-28T19:23:59.997 回答