我需要test.swf拷贝到c的所有子文件夹:/ test文件夹中的不包含“混帐”字
刚刚试过类似的东西,但没有奏效
@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文件夹中的不包含“混帐”字
刚刚试过类似的东西,但没有奏效
@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的路径。 改进的附加分,虽然不是错误:
@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。 然后使用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