我正在寻找一种基于 Windows/Dos 的方法来根据 CSV 导入文件内容重命名和复制/移动文件。
例如:
Import file example:
"C:\Dir1\File001.txt","Q:\Dir02\Dir03\Dir04\NewFile001.txt"
"C:\Dir2\File002.txt","Q:\Dir05\Dir06\Dir07\NewFile002.txt"
"C:\Dir3\File003.txt","Q:\Dir08\Dir09\Dir10\NewFile003.txt"
我需要的
理想情况下,该方法将以上述内容作为输入,并将文件从第 1 列复制/移动到第 2 列,同时创建任何必要的目录。
我还在寻找一些错误处理,例如
- 无法创建目录/文件夹(无论出于何种原因)
- 文件已存在 - 要么在目标位置,要么因为重命名输入将两个同名文件放在同一目录中。
- 有一种方法可以处理冲突(添加后缀等)。
我尝试过的方法
到目前为止,我已经尝试了以下应用程序,但无法按照我的需要让它们工作,所以想看看是否有其他方法而不是软件可以在 Windows 上执行此类操作:
-
- 尝试使用“导入对”功能,但没有结果。(实际上没有任何错误发生。)
-
- 可以导入我的加载文件,但它只使用第 2 列中的文件名。不会将文件移动到文件夹中。
使用移动或复制的 Dos 批处理
现有文件被覆盖,长路径/文件名的错误消息不具描述性,重复文件名没有错误更正。
我的批量复制
COPY /Y "C:\Dir1\File001.txt" "Q:\Dir02\Dir03\Dir04\NewFile001.txt"
如果可能的话,任何其他建议或方法都可以满足我的所有需求,我将不胜感激,因为我尝试过的所有方法都因特定原因而未达到预期的结果,所以我很好奇是否有人超级用户可以帮助我完成这个任务。
答案1
使用一些简单的为/F逻辑并通过相应地设置分隔符和标记,您可以解析 csv 文件的每一行,并使用每个逗号分隔的值作为变量,以便在每次循环迭代中进行相应的处理。
通过一些简单的条件如果逻辑,您可以根据每个条件控制要运行的命令真的或者错误的但在这里它可以检查文件是否已经存在,并采取相应的措施。
使用复制带管道的命令ECHO F
告诉它传递给它的每个参数都是一个文件而不是一个目录,并且如果在文件复制到的路径上的任何地方都不存在任何目录(例如第 2 列),都将在文件复制操作期间创建。
如果目标文件已经存在,并且你希望为复制的每个文件名附加一个唯一的后缀,该后缀在目标目录中具有匹配的文件名,则可以使用简单的称呼逻辑通过每一个为/F循环变量作为例程的参数。
您可以使用替代解析出传递的不同部分称呼变量来重建并将唯一字符串作为后缀附加到任何现有的目标文件。
本质上这将...
- 使用逗号作为分隔符为/F循环并从 csv 文件中获取由每个分隔符分隔的每个值,以便单独用于进一步处理
- 如果第 1 列的源文件不存在,退出,然后处理下一个 csv 行
如果第 2 列的目标文件确实存在,调用一个例程并将两个 csv 文件行值作为变量传递给该例程以进一步扩展和处理
- 此例程将使用日期时间创建一个唯一的字符串
<YYYYMMDD_hhmmsstt>
并确保将其附加到复制的目标文件名中,确保现有文件不会被复制操作覆盖如果目标文件不存在和源文件确实存在,它只会将文件从源复制到目标
如果这些条件都不成立,那么它就不会对这些行中迭代的 csv 文件值执行任何操作。
批处理脚本
@ECHO ON
SET csvfile=C:\Users\User\Desktop\test.csv
FOR /F "USEBACKQ TOKENS=1,2 DELIMS=," %%a in ("%csvfile%") DO (
IF NOT EXIST "%%~a" GOTO :EOF
IF EXIST "%%~b" CALL :DupeRoutine "%%~a" "%%~b"
IF NOT EXIST "%%~b" IF EXIST "%%~a" ECHO F | XCOPY /Y /F "%%~a" "%%~b"
)
GOTO :EOF
:DupeRoutine
::: --Use this with system DATE format "Fri 10/13/2017"
::SET tstamp=%date:~10%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
::: Use this with system DATE format "2017-10-13"
SET tstamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
SET tstamp=%tstamp: =0%
ECHO F | XCOPY /Y /F "%~dpnx1" "%~dp2%tstamp%%~n2%~x2"
GOTO :EOF
笔记: 如果您希望在将文件复制到目标位置后删除源文件,则可以对此示例批处理脚本进行一些细微调整,使用进一步的条件逻辑(例如&& DEL /Q /F <sourcefile>
附加到复制操作完成的适用命令)。
更多资源
- 为/F
- 如果
-
HELP CALL Substitution of batch parameters (%n) has been enhanced. You can now use the following optional syntax: %~1 - expands %1 removing any surrounding quotes (") %~d1 - expands %1 to a drive letter only %~p1 - expands %1 to a path only %~n1 - expands %1 to a file name only %~x1 - expands %1 to a file extension only