我正在尝试将格式化的日期值存储到环境变量中。下面是我的批处理脚本。
set now="`powershell get-date -format \"{yyyy-mm-dd}\"`"
dsjob -run -jobstatus -param current_timestamp=%now% dstage1 TheAge
这不起作用。我是一个Unix人,我希望这比使用for循环和其他解决方案更简单。
如何将执行的命令值存储到环境变量?
答案 0 :(得分:4)
对不起。我可以给你一个不同的观点吗?
有几种不同的方法可以以YYYY-MM-DD格式获取当前日期,但PowerShell并不是最好的方法。 powershell.exe程序是一个大小约为465 MB的文件,最适合加载一次以执行大型.ps1脚本。使用这个程序(包括powershell编程语言的所有高级功能)只是获取当前日期肯定是浪费资源,在慢速机器上可能需要几秒钟。
批处理文件中另一种常用的方法是wmic
,这是一个标准的Windows命令,提供有关计算机及其元素的一系列数据,但它也是一个495 MB的文件,可以执行大量操作而不是非常快。
第三个选项是使用VBScript或JScript脚本;这些是从XP开始在所有Windows版本上预装的编程语言。在这种情况下,对这些语言的运行时支持是C,C ++和JavaScript相同系列的编译器,因此它非常有效。 VBScript / JScript编译器文件(cscript.exe)只有143 MB大小,当然是以YYYY-MM-DD格式独立于区域设置获取当前日期的最有效方法,也就是说,它可以在广泛使用各种计算机的范围。
最后一个短语也提出了最后一种方法。如果批处理文件将始终在同一台计算机上运行,那么您不需要以前方法的高级功能;您可以直接从%date%内部变量获取日期。此方法是最有效的方法,因为它只使用内部批处理命令。
下面是一个批处理文件,显示如何使用以前的所有四种方法。如果您多次执行此批处理文件,您将意识到powershell方法正是效率较低的方法。
@echo off
setlocal
rem Get current date in YYYY-MM-DD format, locale independent
rem Powershell method
for /F %%a in ('powershell get-date -format "{yyyy-mm-dd}"') do set "now=%%a"
echo Powershell: %now%
echo/
rem WMIC method
for /F "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "now=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%"
echo WMIC: %now%
echo/
rem JScript method
echo var d=new Date();WScript.Echo(d.getFullYear()+"-"+(101+d.getMonth()).toString().substr(1)+"-"+(100+d.getDate()).toString().substr(1));>now.js
for /F "delims=" %%a in ('now.js') do set "now=%%a"
echo JScript: %now%
echo/
rem Get current date in YYYY-MM-DD format via %date% variable, locale dependent
for /F "tokens=1-3 delims=/" %%a in ("%date%") do set "now=%%c-%%a-%%b"
echo Pure Batch: %now%
echo/
答案 1 :(得分:2)
最好使用PowerShell脚本完成整个过程;它会更简单,PowerShell的运算符和语法更像bash(当然不是替代品,但仍然是)。
在PowerShell中,这可能是一行:
dsjob -run -jobstatus -param current_timestamp=$(Get-Date -Format yyyy-MM-dd) dstage1 TheAge
当然你也可以使用一个变量:
$now = Get-Date -Format yyyy-MM-dd
dsjob -run -jobstatus -param current_timestamp=$now dstage1 TheAge
您是否有必要使用批处理文件?