Batch file 如何修复将远程服务器上的文件夹移动到远程服务器上的新位置时追加时间戳的问题?

Batch file 如何修复将远程服务器上的文件夹移动到远程服务器上的新位置时追加时间戳的问题?,batch-file,batch-rename,Batch File,Batch Rename,我正在尝试在本地计算机上运行一个批处理脚本,该脚本将负责某些服务器上的一些日志归档。我可以通过文件资源管理器“\SERVERNAME\C$\SOME FOLDER”访问服务器。当我尝试从源本地复制到目标并附加时间戳时,就像时间戳变量不存储我的日期/时间串联一样 这是针对windows 2012r2服务器的,我尝试将日期\时间附加到末尾,效果很好,但是,这不是我想要的格式,它开始用日期嵌套目录,但没有时间,看起来很混乱( 我也尝试过使用wmic,但这是我第一次编写一个批处理文件来自动化一些任务,所

我正在尝试在本地计算机上运行一个批处理脚本,该脚本将负责某些服务器上的一些日志归档。我可以通过文件资源管理器“\SERVERNAME\C$\SOME FOLDER”访问服务器。当我尝试从源本地复制到目标并附加时间戳时,就像时间戳变量不存储我的日期/时间串联一样

这是针对windows 2012r2服务器的,我尝试将日期\时间附加到末尾,效果很好,但是,这不是我想要的格式,它开始用日期嵌套目录,但没有时间,看起来很混乱(

我也尝试过使用wmic,但这是我第一次编写一个批处理文件来自动化一些任务,所以所有这些都是一次很好的学习经历

我尝试了
回显%TIMESTAMP%
但什么也没有返回?我甚至尝试了将连接
(%CUR\u YYYY%%CUR\u MM%%CUR\u DD%-%CUR\u HH%%CUR CUR\u NN%%CUR\u SS%)直接添加到文件目录,但它不起作用:(

预期结果如下所示: 服务器上的SourceFolder将在那里,但为空
DestinationFolder将创建一个新的日志文件夹Logging_20190325010101,并且在新创建的日志文件夹中,SourceFolder中的所有内容都应该在那里。

您需要在设置的命令中清除
=
前后的空白,此外,您还需要在代码块中使用
延迟扩展
改变变量,有一个更好的方法可以去掉冒号和逗号

@echo off
setlocal enabledelayedexpansion
REM Check to see if a service on the machine is stopped (it is always stopped by the time it gets here) before we move the files from the logging directory to a new one.
for /F "tokens=3 delims=: " %%H in ('sc \\REMOTESERVER query "SOME SERVICE NAME" ^| findstr "        STATE"') do (
  if /I "%%H" == "STOPPED" (
REM substring the date and time and then concat it together at the end to make the desired timestamp variable
  set "CUR_YYYY=%date:~10,4%"
  set "CUR_MM=%date:~4,2%"
  set "CUR_DD=%date:~7,2%"
  set "mytime=!time::=!"
  set "mytime=!mytime:,=!"
  set "TIMESTAMP=!CUR_YYYY!!CUR_MM!!CUR_DD!-!mytime!"

REM copy files from the servers source directory and then move the files to a newly created logging folder with a timestamp appened at the end
echo d | xcopy /f /y "\\REMOTE SERVER\src" "\\REMOTE SERVER\dest\Logging_!TIMESTAMP!" /E /I
REM delete the contents of the servers source directory to keep things nice and clean
pushd \\REMOTE SERVER\src && del . /F /Q popd
 )
)
然而,为了解释您的问题,当您设置变量时,空格作为变量的一部分。因此:

set variable = value
将产生一个尾随空格
%variable%
的变量和一个前导空格
值的值
,因此我们总是去掉空格,最好使用双引号来消除值后可能出现的空格。例如:

set "variable=value"

这将在附加代码块内创建
%variable%
value

,当在设置变量值的同一块中检索变量值时,必须延迟扩展。例如:

(
设置“测试=1”
回波[%test%]
)
…将回显“[]”,因为
%test%
是在设置它的同一个附加代码块中检索到的。在计算
%test%
时,它没有任何值。必须使用
setlocal enabledelayedexpansion
或使用
调用回显[%test%%]
延迟扩展(或
cmd/c
或类似功能)。使用
setlocal enabledelayedexpansion
时,您可以通过使用
而不是
%
来延迟扩展,以表示变量。有关更多信息,请参阅cmd控制台中的
setlocal/?
set/?
,尤其是
set/?
开头的部分“最后,添加了对延迟环境变量扩展的支持。”

此外,使用
wmic os get localdatetime
编写时间戳更简单、更不受地区限制。示例:

对于/f“delims=。”%%I in('wmic os get localdatetime/value^ | find“=”),请设置“%%~I”
回显%localdatetime%

这将导致
%localdatetime%
包含YYYYMMDDHHMMSS的当前数值。

您能简单解释一下为什么使用%作为日期而不是时间吗?我看到Rojo提到了!是在想要延迟扩展时使用的?提前感谢您的帮助。您也可以使用
作为日期,我从未更新过答案中的所有内容……但我的重点是向您展示如何在时间变量上展开。
set "variable=value"