我需要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中
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
肯定是没有错与使用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 – spekdrum 2012-10-18 10:44:04