将远程服务器上的文件夹移动到远程服务器上的新位置时如何修复附加时间戳?
How to fix appending a timestamp when moving a folder on a remote server to a new location on the remote server?
我正在尝试 运行 在我的本地计算机上创建一个批处理脚本,它将处理某些服务器上的一些日志归档。我可以通过文件资源管理器“\SERVERNAME\C$\SOME FOLDER”访问服务器。当我尝试从本地 xcopy 从源到目标并附加时间戳时,它就像 TIMESTAMP 变量不存储我的 date/time 连接。
这是针对 windows 2012r2 服务器的,我尝试仅将 date\time 附加到末尾,效果很好,但是,它不是我正在寻找的所需格式,它开始了用日期嵌套目录但没有时间,看起来一团糟。 :(
我也尝试过使用 wmic,但这是我第一次编写批处理文件来自动执行某些任务,所以所有这些都是一次很棒的学习经历。
我试过 echo %TIMESTAMP%
但没有 returns?我什至尝试将串联 (%CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%)
直接添加到文件目录,但它不起作用:(
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 CUR_HH = %time:~0,2%
set CUR_NN = %time:~3,2%
set CUR_SS = %time:~6,2%
set CUR_MS = %time:~9,2%
set TIMESTAMP = %CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%
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
)
)
预期结果如下:
服务器上的 SourceFolder 将在那里但为空
DestinationFolder 将创建一个新的 Logging 文件夹 Logging_20190325010101,在新创建的日志文件夹中,SourceFolder 中的所有内容都应该在那里。
你需要去掉set命令中=
前后的白色space,另外,你需要在代码块中改变变量的delayedexpansion
,还有是摆脱冒号和逗号的更好方法。
@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
)
)
然而,为了解释您的问题,当您设置变量时,白色 space 作为变量的一部分出现。所以:
set variable = value
会产生一个尾随 space %variable %
和一个前导 space <space>value
的变量,所以我们总是去掉白色 space 并且最好使用双引号来消除值后面可能出现的白色space。例如:
set "variable=value"
这将创建 %variable%
和 value
在括号内的代码块中,当在设置它们的同一块中检索变量值时,您必须延迟扩展。例如:
(
set "test=1"
echo [%test%]
)
... 会回显“[]”,因为 %test%
是 检索到的 在 set。在评估 %test%
时,它没有任何价值。您必须使用 setlocal enabledelayedexpansion
或 call echo [%%test%%]
(或 cmd /c
或类似的)来延迟扩展。使用 setlocal enabledelayedexpansion
时,您可以通过使用 !
而不是 %
来表示变量来延迟扩展。有关详细信息,请参阅 cmd 控制台中的 setlocal /?
和 set /?
- 特别是 set /?
中以 "Finally, support for delayed environment variable expansion has been added."
开头的部分
此外,使用 wmic os get localdatetime
编写时间戳更简单且与区域设置无关。示例:
for /f "delims=." %%I in ('wmic os get localdatetime /value ^| find "="') do set "%%~I"
echo %localdatetime%
这应该导致 %localdatetime%
包含 YYYYMMDDHHMMSS 的当前数值。
我正在尝试 运行 在我的本地计算机上创建一个批处理脚本,它将处理某些服务器上的一些日志归档。我可以通过文件资源管理器“\SERVERNAME\C$\SOME FOLDER”访问服务器。当我尝试从本地 xcopy 从源到目标并附加时间戳时,它就像 TIMESTAMP 变量不存储我的 date/time 连接。
这是针对 windows 2012r2 服务器的,我尝试仅将 date\time 附加到末尾,效果很好,但是,它不是我正在寻找的所需格式,它开始了用日期嵌套目录但没有时间,看起来一团糟。 :(
我也尝试过使用 wmic,但这是我第一次编写批处理文件来自动执行某些任务,所以所有这些都是一次很棒的学习经历。
我试过 echo %TIMESTAMP%
但没有 returns?我什至尝试将串联 (%CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%)
直接添加到文件目录,但它不起作用:(
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 CUR_HH = %time:~0,2%
set CUR_NN = %time:~3,2%
set CUR_SS = %time:~6,2%
set CUR_MS = %time:~9,2%
set TIMESTAMP = %CUR_YYYY%%CUR_MM%%CUR_DD%-%CUR_HH%%CUR_NN%%CUR_SS%
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
)
)
预期结果如下: 服务器上的 SourceFolder 将在那里但为空 DestinationFolder 将创建一个新的 Logging 文件夹 Logging_20190325010101,在新创建的日志文件夹中,SourceFolder 中的所有内容都应该在那里。
你需要去掉set命令中=
前后的白色space,另外,你需要在代码块中改变变量的delayedexpansion
,还有是摆脱冒号和逗号的更好方法。
@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
)
)
然而,为了解释您的问题,当您设置变量时,白色 space 作为变量的一部分出现。所以:
set variable = value
会产生一个尾随 space %variable %
和一个前导 space <space>value
的变量,所以我们总是去掉白色 space 并且最好使用双引号来消除值后面可能出现的白色space。例如:
set "variable=value"
这将创建 %variable%
和 value
在括号内的代码块中,当在设置它们的同一块中检索变量值时,您必须延迟扩展。例如:
(
set "test=1"
echo [%test%]
)
... 会回显“[]”,因为 %test%
是 检索到的 在 set。在评估 %test%
时,它没有任何价值。您必须使用 setlocal enabledelayedexpansion
或 call echo [%%test%%]
(或 cmd /c
或类似的)来延迟扩展。使用 setlocal enabledelayedexpansion
时,您可以通过使用 !
而不是 %
来表示变量来延迟扩展。有关详细信息,请参阅 cmd 控制台中的 setlocal /?
和 set /?
- 特别是 set /?
中以 "Finally, support for delayed environment variable expansion has been added."
此外,使用 wmic os get localdatetime
编写时间戳更简单且与区域设置无关。示例:
for /f "delims=." %%I in ('wmic os get localdatetime /value ^| find "="') do set "%%~I"
echo %localdatetime%
这应该导致 %localdatetime%
包含 YYYYMMDDHHMMSS 的当前数值。