Windows批处理命令创建备份文件夹和替换文件夹

2024-01-27

我需要使用日期时间戳备份现有文件夹,并将其替换(删除并重新创建)为文件夹内的新内容。

有人有脚本可以做到这一点吗?

我尝试了以下代码,其中%ApplicationDeploymentFolderPath% = \\servername\foldername

IF EXIST %ApplicationDeploymentFolderPath%\Release (

REM Get current date time
@echo off
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c_%%b_%%a)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
set backup_folder=%mydate%_%mytime%
MD %ApplicationDeploymentFolderPath%\%backup_folder%

REM Copy current folder to backup folder
Copy %ApplicationDeploymentFolderPath%\Release %ApplicationDeploymentFolderPath%\%backup_folder% 

REM Delete Existing Release folder 
RD %ApplicationDeploymentFolderPath%\Release /S /Q
)

MD %ApplicationDeploymentFolderPath%\Release

The command date带参数/T以当前用户帐户配置的国家/地区定义的格式输出当前日期。通过引用动态可以访问完全相同的日期字符串环境变量 DATE例如与%DATE%.

The command time带参数/T以当前用户帐户配置的国家/地区定义的格式输出当前时间。通过引用动态可以访问完全相同的时间字符串环境变量 TIME例如与%TIME%.

执行此命令行会发生什么?

For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c_%%b_%%a)

for分别cmd.exe处理批处理文件在后台启动另一个命令进程,使用%ComSpec% /c之间的命令行'。因此,在后台执行的操作如下,Windows 安装在C:\Windows:

C:\Windows\System32\cmd.exe /c date /t

的输出command date处理STDOUT该命令进程在后台的捕获是FOR分别执行批处理文件的Windows命令处理器实例。

使用以下命令将捕获的行分成三个子字符串/作为分配给循环变量的字符串分隔符a, b and c它们以相反的顺序连接在一起,并使用下划线作为分隔符。

通过替换可以更快地完成此任务'date /t' by "%DATE%"。在这种情况下FOR处理日期string通过已经运行的扩展cmd.exe在执行之前解析此命令行FOR。所以不再有一个开始cmd.exe在后台并捕获其输出只是为了处理相同的日期string这使得批处理文件的执行速度更快一些。

对于'time /t'可以替换为"%TIME%".

但两人FOR可以通过使用字符串替换来完全优化循环,例如答案中所描述的%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2% 是什么意思? https://stackoverflow.com/a/37236739/3074564与区域相关的日期和时间格式是众所周知的,例如通过在命令提示符窗口中运行:

echo %DATE% %TIME%

此命令根据配置的国家/地区以德国日期/时间格式在我的计算机上输出:

24.07.2019 20:15:29,90

在此输出中可以看出,原始代码无法在我的 Windows 计算机上使用我的帐户运行,因为日期字符串包含.并不是/并且时间字符串包含逗号。

因此,最好使用与区域无关的解决方案,如答案中详细解释的那样为什么%date%在按计划任务执行的批处理文件中产生不同的结果? https://stackoverflow.com/a/44670322/3074564缺点是执行wmic.exe需要比cmd.exe需要将日期和时间字符串重新格式化为yyyy_MM_dd_HHmm。但是,批处理文件每天执行的频率很可能不是很高,因此获取这种格式的日期/时间的执行是否需要几毫秒或大约一秒并不重要。

在这种情况下,复制整个文件夹并不是真正必要的。将其重命名为:

ren "%ApplicationDeploymentFolderPath%\release" "%backup_folder%"

命令move也可以使用 if 命令ren由于未知原因无法使用。

然而,主要问题是缺乏关于如何以及何时使用的知识延迟扩张 https://ss64.com/nt/delayedexpansion.html。打开一个命令提示符 https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/, run set /?并阅读输出帮助解释IF and a FOR示例延迟环境变量扩展。

这里的问题是backup_folder未在执行引用它的命令行时定义%backup_folder%因为所有的发生%variable%被Windows命令处理器取代,已经解析整个命令块,从这里开始( on IF执行命令之前,顶部的条件按引用的环境变量的当前值显示IF.

因此在现有发布文件夹上执行的是:

set backup_folder=
MD \\servername\foldername\

REM Copy current folder to backup folder
Copy \\servername\foldername\Release \\servername\foldername\ 

REM Delete Existing Release folder 
RD \\servername\foldername\Release /S /Q

这可以通过以下方式看到调试批处理文件 https://stackoverflow.com/a/42448601/3074564.

也可以看看:Windows 命令解释器 (CMD.EXE) 如何解析脚本? https://stackoverflow.com/questions/4094699/

解决方案是通过更改第一个来避免命令块IF健康)状况。

快速区域依赖的解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ApplicationDeploymentFolderPath=\\servername\foldername"

if not exist "%ApplicationDeploymentFolderPath%\Release\" goto CreateFolder

ren "%ApplicationDeploymentFolderPath%\Release" "%DATE:~-4%_%DATE:~-7,2%_%DATE:~-10,2%_%TIME:~0,2%%TIME:~3,2%"

:CreateFolder
md "%ApplicationDeploymentFolderPath%\Release"
endlocal

较慢的区域独立的解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ApplicationDeploymentFolderPath=\\servername\foldername"

if not exist "%ApplicationDeploymentFolderPath%\Release\" goto CreateFolder

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "BackupDateTime=%%I"
set "BackupDateTime=%BackupDateTime:~0,4%_%BackupDateTime:~4,2%_%BackupDateTime:~6,2%_%BackupDateTime:~8,4%"
ren "%ApplicationDeploymentFolderPath%\Release" "%BackupDateTime%"

:CreateFolder
md "%ApplicationDeploymentFolderPath%\Release"
endlocal

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • ren /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows批处理命令创建备份文件夹和替换文件夹 的相关文章

随机推荐

  • Python subprocess.popen() 无需等待

    我在 Windows 上使用 Python 3 4 2 在 script1 py 中我正在这样做 myProc subprocess Popen sys executable script2 py argument myProc commu
  • iPhone 上奇怪的应用程序崩溃 - 没有被 Apple 拒绝

    我最近通过 iTunes Connect 向 Apple 提交了我的应用程序 它现在已在 iTunes 商店中 然而 当我把它下载到朋友的 iPhone 上时 它立即崩溃了 我在 iPhone 模拟器和 iPad 上进行了测试 我没有 iP
  • 可编辑数据表 RowKey Null

    我有一个可编辑的 Primefaces 数据表 配置为在编辑单元格时调用 onCellEdit 方法 一切工作都很好 除了 CellEditEvent rowKey 始终为 null 尽管在数据表声明中使用 rowKey 将其显式设置为有效
  • 在 Windows 上,如何检测文件的行结尾?

    我已经看到了这些问题的答案 但据我所知 这些答案并不是从 Windows 角度来看的 Windows 使用 CR LF Unix 使用 LF Mac 使用 LF 经典 mac 使用其他内容 我没有足够的智慧来告诉我 如果一个文件使用的行尾与
  • 如何使浏览器后退按钮忽略主题标签?

    我有一个网站 它使用哈希来打开 关闭当前页面上的一些选项卡和图层 使用哈希值的原因是 如果用户通过链接访问另一个页面 然后返回原始页面 则所有选项卡和图层的打开方式都应与离开该页面时完全相同 问题是 在第一页上并使用浏览器后退按钮时 只有哈
  • Bower:ENOGIT Git 未安装或不在 PATH 中

    Git 已安装并位于路径中 平台 红帽企业 Linux en wikipedia org wiki Red Hat Enterprise Linux 5 8 gt which git usr local bin git 然而 Bower 找
  • 基于窗口调整大小的 jQuery 位置元素

    如果您查看此页面 http dev driz co uk tips http dev driz co uk tips 我正在做一些实验来更多地了解 jQuery 以及如何开发类似于我们在 Facebook 上看到的东西 您将看到我有一个相对
  • Tensorflow.compat.v2.__internal__.tracking'没有属性'TrackableSaver'错误

    安装 Tensorflow js 后出现此错误 以前这个程序是有效的 会不会是版本的问题 我真的很好奇是什么原因造成的 提前致谢 File OneDrive Masa st Bitirme Proje neural network sini
  • Android - Google Map API v2 - 不幸的是,应用程序已停止。每次强制关闭

    大家好 我在这里找到了关于使用 Google Map API 时强制关闭 Android 中的应用程序的类似主题 我几乎尝试了所有方法 一步一步按照教程进行操作并检查了两次以上 每次出现问题并且我的应用程序都会立即崩溃 我什至无法运行 Go
  • Bootstrap-select插件:如何避免闪烁

    Bootstrap select 插件非常棒 http silviomoreto github io bootstrap select http silviomoreto github io bootstrap select 它提供了一种在
  • Ruby on Rails、Paperclip、Heroku、GitHub 和 AWS - 保护密钥

    我正在使用 Heroku 托管的 RoR 我想使用回形针将文件存储在 s3 上 我的源代码托管在 github 上 全世界都可读 对世界其他地方保密密钥的最佳做法是什么 Paperclip 建议将访问密钥存储在配置文件 或代码 中 例如我有
  • 使用单链表,如何在python中交换节点?

    目前 我一直在尝试根据我的主功能开关 myList index 重新排列链表 def createList plist linkedList None goes backwards adding each element to the be
  • 使用 XPath 提取标签之间的文本(包括标记)

    我有以下 XML 片段 span class st In Tim em Power em Politieman span 我想提取之间的部分 span 标签 为此 我使用 XPath span class st 然而 这将提取所有内容 包括
  • 设置 ContentPresenter 中自动生成的文本块的样式

    正如我所看到的 很多人都遇到了这个问题 但我不明白为什么我的案例不起作用 它开始让我发疯 背景 我有一个DataGrid将根据每个单元格的值着色 因此 我有一个动态样式来解析每个单元格使用的实际模板 背景现在可以相应地工作 新问题 当我有深
  • 在会话状态中存储购物车的数据

    尝试将我存储的内容添加到购物车中以进入会话 然后将其转移到另一个页面以获取 GridView 以显示我已添加到购物车会话中的所有项目 将其存储为对象会话 AddToCart 获取该行详细信息并存储在会话中 然后获取该会话对象并将其显示在另一
  • HTML5 CANVAS:如何从服务器保存和重新打开图像

    我用 html5 canvas 画一些东西 然后我想保存它 当再次加载页面时 我想将我保存的图像加载回画布 我成功地将数据保存到服务器中的文件中 但由于某种原因 这是一个奇怪的文件 无法通过ant软件打开 当然也不能通过我的画布打开 我将其
  • 使用 f#/fable/asp.net/react 添加 google 登录按钮

    我正在使用 SAFE 堆栈 https safe stack github io https safe stack github io 并通过示例 dojo 到目前为止非常棒 我想扩展该示例以包含一个通过 Google 登录 身份验证的按钮
  • JavaScript 基于原型的继承的好例子

    我使用 OOP 语言进行编程已经有 10 多年了 但我现在正在学习 JavaScript 这是我第一次遇到基于原型的继承 我倾向于通过研究好的代码来学得最快 正确使用原型继承的 JavaScript 应用程序 或库 的编写良好的示例是什么
  • 如何将 ASP.Net Webforms 网站与 ASP.Net MVC Web 应用程序集成?

    我如何在一个主网站 例如 www example com 下运行这两个网站 该网站是使用 Visual Studio ASP Net MVC Web 应用程序项目编写和部署的 并且 ASP Net Web 表单网站将从主站点的子目录 例如
  • Windows批处理命令创建备份文件夹和替换文件夹

    我需要使用日期时间戳备份现有文件夹 并将其替换 删除并重新创建 为文件夹内的新内容 有人有脚本可以做到这一点吗 我尝试了以下代码 其中 ApplicationDeploymentFolderPath servername foldernam