[英]Writing a batch file with PowerShell
我正在尝试创建一个包含PowerShell的批处理脚本以获取昨天的日期。
到目前为止,我已经设法编写了“获取日期”部分,如下所示:
powershell $date=Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyyMMdd')
如何将$date
变量传递回批处理脚本,以便可以使用$date
变量移动文件? 我在这里想要实现的目标如下所示:
move *%date%*.xml D:\Sample\
我想在一个批处理脚本中完成此操作。
如果我正确理解了您的问题,那么您想编写一个使用Powershell获取先前日期的批处理脚本( .bat
)。
您可以在.bat
脚本中放入以下内容以获取值。
powershell -Command (Get-Date).AddDays(-1).ToString('yyyyMMdd')
你并不需要“回传”中的变量。 相反,您只需使powershell
的输出调用所需的信息即可。 使用您发布的代码,没有输出。 但是,使用上面的内容等同于“返回”代码中的$date
变量。
但是,批处理实际上并没有一种简单的方法来捕获变量。 捕获变量有两种主要方法。 您可以使用for
循环(这是一种技巧),也可以将输出写入文件,然后将该文件读入变量。
方法1-循环
这是将输出捕获到名为v
的代码(使用%v%
访问)。
for /f %d in (
'powershell.exe -Command "(Get-Date).AddDays(-1).ToString(\"yyyyMMdd\")"'
) do set "v=%d"
方法2-文件输出
在这里,我们将powershell输出写入一个文件,该文件的名称存储在变量tempFile
。 然后,我们将文件的内容读回到名为v
的变量中。 最后,我们删除tempFile
。
powershell.exe -Command (Get-Date).AddDays(-1).ToString('yyyyMMdd') > %tempFile%
set /p v=< %tempFile%
del %tempFile%
您可以按以下方式运行PowerShell命令行,以在批处理脚本的变量中获取值:
@echo off
for /f "tokens=* delims=" %%d in (
'powershell.exe -Command "(Get-Date).AddDays(-1).ToString(\"yyyyMMdd\")"'
) do set "yesterday=%%d"
move *%yesterday%*.xml D:\Sample\
您不应将变量命名为%date%
,因为这是CMD自动使用当前日期填充的变量。 查看help set
:
%DATE%-使用与DATE命令相同的格式扩展到当前日期。
但是,正如@alroc在对问题的评论中建议的那样,仅在PowerShell中编写整个脚本可能会更简单:
$yesterday = (Get-Date).AddDays(-1).ToString('yyyyMMdd')
Move-Item "*$yesterday*.xml" 'D:\Sample'
您也可以在CMD.exe中完全完成此操作,尽管它稍微复杂一些。
:Get_Dates
set day=%DATE:~-10,2%
set month=%DATE:~-7,2%
set year=%DATE:~-4%
set TODAY=%year%-%month%-%day%
set /a tag-=1
if %day% LEQ 0 set /a monat-=1
if %month% LEQ 0 set /a jahr-=1 & set monat=12
if %day% GEQ 1 goto :done
rem day is in the previous month
if %month% EQU 1 set tag=31
if %month% EQU 3 set tag=31
if %month% EQU 4 set tag=30
if %month% EQU 5 set tag=31
if %month% EQU 6 set tag=30
if %month% EQU 7 set tag=31
if %month% EQU 8 set tag=31
if %month% EQU 9 set tag=30
if %month% EQU 10 set tag=31
if %month% EQU 11 set tag=30
if %month% EQU 12 set tag=31
if %month% NEQ 2 goto :done
rem februar so check year
set /a mod4=year % 4
set /a mod100=year % 100
set /a mod400=year % 400
set day=28
if %mod4% NEQ 0 goto :done
set day=29
if %mod100% NEQ 0 goto :done
set day=28
if %mod400% NEQ 0 goto :done
set day=29
:done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.