在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法

Posted

技术标签:

【中文标题】在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法【英文标题】:Best way to programmatically copy, rename, and paste files in Windows 【发布时间】:2021-05-06 06:38:14 【问题描述】:

我有一个目录 C:\HotFolders,其中应用程序每 15 分钟写入 csv 文件,文件名格式为 YYYYMMDDhhmmss_DG@001991.csv。

我需要复制新文件(因为它们已创建),然后将它们粘贴到另一个目录中,并稍微更改文件名(_DG 到 _GWL)。

我最初尝试制作一个 SSMS 包 (此处描述:https://jimsalasek.com/2017/03/15/ssis-create-extract-file-with-date-and-time-for-a-filename/) 查询 SQL 数据库,生成相同的文件并导出到目录,但 SQL 版本控制问题导致在 SSMS 中运行 SSIS 包(.dtsx 文件)目前无法运行。

我已经尝试了一些 python 脚本来执行此操作(如下),但扫描目录以查找最新文件、复制并按计划(例如每 5 分钟)粘贴重命名的文件让我陷入循环。

我知道批处理和 powershell 也是选项,甚至是我愿意接受的第 3 方软件。我只需要一些关于最佳方法的指导,任何代码都将不胜感激。

Python sn-p

import os
files = [os.path.join('C:\\test', x) for x in os.listdir('C:\\test') if x.endswith(".csv")]
newest = max(files , key = os.path.getctime)```



【问题讨论】:

这不是很清楚..您是在谈论从文件 NAME 还是从它的创建/上次修改时间获取时间和日期?你认为 the new files 是什么?只需选择最新的并复制/重命名它或... 【参考方案1】:

希望我理解得很好,这就是您正在寻找的:

Function Rename-Stuff
Get-ChildItem -Path "C:\HotFolders" | Foreach Rename-Item $_.FullName -NewName $_.Name.Replace("_DG","_GWL") 
    Foreach($file in (Get-ChildItem -Path "C:\HotFolders")) Move-Item -Path $file.FullName -Destination "C:\New\Path\Here"
    Start-Sleep 360
    &Rename-Stuff

请告诉我这是否是您要查找的内容,以及您是否想了解这个简短的脚本块中发生的情况;我很乐意解释它(只是不想假设你不知道就是全部)。

糟糕,刚刚意识到您想复制这些项目:

Function Copee-Stuff
Copy-Item -Path "C:\HotFolders" -Recurse -Destination "C:\New\Path\Here" 
    Foreach($file in (Get-ChildItem -Path "C:\New\Path\Here")) Rename-Item $file.FullName -NewName $file.Name.Replace("_DG","_GWL")
    Start-Sleep 360
    &Copee-Stuff

请注意:您还可以通过 csv 或任何其他提供 -Filter 参数的文件扩展名进行过滤。

【讨论】:

执行 ps1 脚本时没有任何反应。我需要玩一下,看看我做错了什么。 你是如何执行它的?将其粘贴到 ISE 窗格中,然后在 cosole 中键入:Copee-Stuff 以运行该函数。【参考方案2】:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"

:again

:: Find latest converted
SET "latest=20000000000000"
FOR /f "delims=_" %%b IN ('dir /b /a-d /o-n "%destdir%\*_GWL*.csv" 2^>nul' ) DO (SET "latest=%%b"&GOTO gotlatest)
:gotlatest

FOR /f "delims=" %%b IN ('dir /b /a-d /o-n "%sourcedir%\*_DG*.csv" 2^>nul') DO (
 FOR /f "tokens=1*delims=_" %%q IN ("%%b") DO IF "%%q" gtr "%latest%" (
  rem for each later file
  SET "filenametail=%%r"
  ECHO COPY "%sourcedir%\%%b" "%destdir%\%%q_GWL!filenametail:~2!" 
  COPY "%sourcedir%\%%b" "%destdir%\%%q_GWL!filenametail:~2!" >nul 
  ECHO Press X or Q to EXIT %~n0
 ) ELSE GOTO wait
)

:wait
:: wait 300 sec (5 min)
choice /c xqc /n /t 300 /d c >nul
IF ERRORLEVEL 3 GOTO again

ECHO Process %~n0 EXIT...

GOTO :EOF

评论应该足以破译。

【讨论】:

以上是关于在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

是否有通过 Windows 资源管理器以编程方式剪切/复制/粘贴文件的 Windows API?

在 Ionic 中以编程方式从 Branch 链接解码和获取数据

For循环复制粘贴文件夹并使用增量重命名它

多次复制文件夹及其内容,然后重命名它们

如何在 Linux Mint 中以编程方式发送密钥(模拟密钥输入)?

可以以编程方式使用新的WP7剪切和粘贴功能吗?