Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Batch file可使用计数器将树中的所有.sql文件复制到单个文件夹中,以处理同名文件_Batch File - Fatal编程技术网

Batch file Batch file可使用计数器将树中的所有.sql文件复制到单个文件夹中,以处理同名文件

Batch file Batch file可使用计数器将树中的所有.sql文件复制到单个文件夹中,以处理同名文件,batch-file,Batch File,我正在寻找一些帮助来设置批处理脚本,以便遍历整个目录并将所有.sql文件复制到单个文件夹中。通过FOR循环,我可以很容易地做到这一点,但如果不同目录中的两个或多个文件具有相同的名称,我就会遇到障碍。我试图用一个计数器来解决这个问题,但是我很难让它特定于单个文件名 到目前为止,我的代码是: set /A n=0 for /R %source% %%G in (*.sql) do ( if exist %destination%\sql_files\%%~nxG ( set

我正在寻找一些帮助来设置批处理脚本,以便遍历整个目录并将所有.sql文件复制到单个文件夹中。通过
FOR
循环,我可以很容易地做到这一点,但如果不同目录中的两个或多个文件具有相同的名称,我就会遇到障碍。我试图用一个计数器来解决这个问题,但是我很难让它特定于单个文件名

到目前为止,我的代码是:

set /A n=0

for /R %source% %%G in (*.sql) do (
    if exist %destination%\sql_files\%%~nxG (
        set /A n+=1
        set "full=%%G"
        set "name=%%~nG"
        set "ext=%%~xG"
        setlocal enabledelayedexpansion
        copy "!full!" "!destination!\sql_files\!name!(!n!)!ext!" >nul
        endlocal
    ) else (
        copy "%%G" "%destination%\sql_files\" >nul
    )
)
例如,如果我有:

我的结局是:

我想看到的是:


我认为我的答案可能在一个子程序中,但我不能完全理解使其工作的逻辑。非常感谢您的帮助。

这里有一个脚本,可以满足您的需要。这取决于目标目录最初为空的事实:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“源=”
设置“目标=…\sql\U文件”
设置“PATTERN=*.sql”
设置“TMPFILE=%TEMP%\%~n0\%RANDOM%.tmp”
rem//创建目标目录,检查是否为空:
2> nul md“%DESTINATION%”
(2>nul dir/B/A“%DESTINATION%\*.*”\124;>nul find/V“)&&(
>&2回显目标目录“%DESTINATION%”不为空!
退出/B 1
)
rem/*将文件列表写入临时文件;每条线都能容纳
rem纯文件名和完整路径,以“:”分隔:*/
如果未定义源,则设置“源=”
>%TMPFILE%(
对于(“%PATTERN%”中的/R“%SOURCE%”%%F,请执行以下操作(
回声:%%~nxF:%%~fF
)
)
rem//读取按文件名排序的行的临时文件:
设置“PREV=:”&设置/A“索引=0”
对于/F“tokens=1,*delims=:”%%E in('排序“%TMPFILE%”)do(
rem//缓存文件名部分和完整路径:
设置“文件=%%E”
设置“名称=%%~nE”
设置“EXT=%%~xE”
设置“满=%%F”
rem//将当前文件名与以前的文件名进行比较:
setlocal EnableDelayedExpansion
如果/I不是“!FILE!”==”!PREV!”(
端部
rem//如果名称不匹配,则重置索引:
设置/A“索引=0”
)否则(
端部
rem//如果名称不匹配,则增加索引:
设置/A“索引+=1”
)
rem//生成新文件nase名称:
setlocal EnableDelayedExpansion
如果!索引!全球技术法规0(
设置“NAME=!NAME!(!INDEX!)”
)
rem//复制文件并相应重命名:
>nul副本“!完整!”!目的地!\!名称!!分机!”
端部
rem//缓存已处理的文件名:
设置“PREV=%%E”
)
rem//删除临时文件:
删除“%TMPFILE%”
端部
退出/B

这是一个脚本,可以实现您想要的功能。这取决于目标目录最初为空的事实:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“源=”
设置“目标=…\sql\U文件”
设置“PATTERN=*.sql”
设置“TMPFILE=%TEMP%\%~n0\%RANDOM%.tmp”
rem//创建目标目录,检查是否为空:
2> nul md“%DESTINATION%”
(2>nul dir/B/A“%DESTINATION%\*.*”\124;>nul find/V“)&&(
>&2回显目标目录“%DESTINATION%”不为空!
退出/B 1
)
rem/*将文件列表写入临时文件;每条线都能容纳
rem纯文件名和完整路径,以“:”分隔:*/
如果未定义源,则设置“源=”
>%TMPFILE%(
对于(“%PATTERN%”中的/R“%SOURCE%”%%F,请执行以下操作(
回声:%%~nxF:%%~fF
)
)
rem//读取按文件名排序的行的临时文件:
设置“PREV=:”&设置/A“索引=0”
对于/F“tokens=1,*delims=:”%%E in('排序“%TMPFILE%”)do(
rem//缓存文件名部分和完整路径:
设置“文件=%%E”
设置“名称=%%~nE”
设置“EXT=%%~xE”
设置“满=%%F”
rem//将当前文件名与以前的文件名进行比较:
setlocal EnableDelayedExpansion
如果/I不是“!FILE!”==”!PREV!”(
端部
rem//如果名称不匹配,则重置索引:
设置/A“索引=0”
)否则(
端部
rem//如果名称不匹配,则增加索引:
设置/A“索引+=1”
)
rem//生成新文件nase名称:
setlocal EnableDelayedExpansion
如果!索引!全球技术法规0(
设置“NAME=!NAME!(!INDEX!)”
)
rem//复制文件并相应重命名:
>nul副本“!完整!”!目的地!\!名称!!分机!”
端部
rem//缓存已处理的文件名:
设置“PREV=%%E”
)
rem//删除临时文件:
删除“%TMPFILE%”
端部
退出/B

核心问题可能重复:您从未重置计数器
n
。我觉得你的任务很重要。我认为您需要对返回的源文件进行预排序,因为计数器
n
链接到文件名,而不是包含的子目录。目标目录最初是否保证为空,或者可能已经存在文件?目标目录将为空。核心问题可能重复:您从未重置计数器
n
。我觉得你的任务很重要。我认为您需要对返回的源文件进行预排序,因为计数器
n
链接到文件名,而不是包含的子目录。目标目录最初是否保证为空,或者是否已经存在文件?目标目录将为空。
%source%\dir1\file1.sql
%source%\dir1\file2.sql
%source%\dir2\file1.sql
%source%\dir2\file2.sql
%source%\dir3\file1.sql
file1.sql
file1(1).sql
file1(3).sql
file2.sql
file2(2).sql
file1.sql
file1(1).sql
file1(2).sql
file2.sql
file2(1).sql