gpt4 book ai didi

windows - 如何在批处理文件的同一行上设置多个因变量?

转载 作者:可可西里 更新时间:2023-11-01 14:41:45 25 4
gpt4 key购买 nike

这是受 another post on Arqade 的启发, 关于如何使用批处理脚本备份一些文件。

以下 block 使用当前日期/时间字符串创建一个变量:

REM -- Get the current date/time stamp
set DS=%date%
set TS=%time: =0%
set mm=%DS:~4,2%
set dd=%DS:~7,2%
set yyyy=%DS:~10,4%
set hh=%TS:~0,2%
set min=%TS:~3,2%
set ss=%TS:~6,2%
set ms=%TS:~9,2%
set DT_STAMP=%yyyy%-%mm%-%dd%_%hh%.%min%.%ss%

作为脚本编写者,将这些内容整合到一行中通常很方便。然而,在这种情况下,将其压缩为一行是极其困难的,如果不是不可能的话。

似乎没有办法将多个 set 命令放在一行中。用 &&& 分隔命令可以正常工作,但右侧的命令不能依赖于先前在同一行上设置的变量。

另外,请注意 time 变量如何必须空格 替换为零 0。似乎没有办法在同一行上同时进行字符串替换 获取子字符串。

有什么办法可以将其简化为一行吗?我能得到的最接近的是两行:

set DS=%date% && set TS=%time: =0%
set DT_STAMP=%DS:~10,4%-%DS:~4,2%-%DS:~7,2%_%TS:~0,2%.%TS:~3,2%.%TS:~6,2%

更新

这收集了一些很好的答案;请允许我澄清接受的答案必须具备的内容:

  • 一个丑陋但可重用的单行解决方案就可以了 (上面已经提供了漂亮的版本)
  • 仅限标准 shell 命令 (必须避免使用 PowerShell 和类似命令;如果我想要这些,我会在 PowerShell 中完成所有操作)
  • 能够以任何逻辑格式格式化日期(应该能够做上面漂亮版本可以做的任何事情,而不仅仅是使用速记符号支持 ISO 格式的日期)
  • 可以忽略本地化设置(真的,就这一次!)
  • 必须在一行中! (例如,delayed expansion 很方便,但可能有严重的副作用,不能在所有上下文中重复使用,并且通常需要多行)

最佳答案

使用 FOR/F 语句很简单,但正如 npocmaka 已经说过的,它取决于本地化。

我假设你的日期/时间看起来像

Fri 09/14/2018
8:15:46.12

然后这行得通

for /F "tokens=1-7 delims=/:,. " %%1 in ("%date% %time: =0%") do set DT_STAMP=%%4-%%2-%%3_%%5.%%6.%%7

但是对于德语本地化你需要

for /F "tokens=1-7 delims=/:,. " %%1 in ("%date% %time: =0%") do set DT_STAMP=%%3-%%2-%%1_%%4h%%5m%%6s

使用批处理宏的解决方案

你可以构建一个批处理宏,宏的使用更具可读性,但宏本身有点复杂

使用宏,它将当前时间戳分配给变量 myDT1:

%@AssignTimeStamp% myDT1
echo %myDT1%

宏的定义(定义宏时必须禁用延迟扩展):

REM *** Macro definition, be sure that there aren't any trailing whitespaces
set ^"LF=^
%= This creates a variable containing a single linefeed (0x0A) character =%
^"
:: Define %\M% to effectively issue a newline with line continuation
set ^"\M=^^^%LF%%LF%^%LF%%LF%^^"

set @AssignTimeStamp=for %%. in (1 2) do if %%.==2 (%\M%
%= The next line builds the timestamp =%%\M%
for /F "tokens=1-7 delims=/:,. " %%1 in ("%date% %time: =0%") do set timestamp=%%4-%%2-%%3_%%5h%%6m%%7s%\M%
%= When a variable name was give then store the timestamp there, else output the timestamp =%%\M%
for /F "tokens=1,2 delims=, " %%1 in ("#,!argv!") do ( %\M%
for %%V in (!timestamp!) do endlocal^&if "%%~2" neq "" (set "%%2=%%V") else echo ##%%V%\M%
)%\M%
) else setlocal enableDelayedExpansion^&set argv=,

关于windows - 如何在批处理文件的同一行上设置多个因变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com