使用PowerShell编写批处理文件

时间:2015-09-06 08:12:00

标签: powershell batch-file

我正在尝试创建一个包含PowerShell的批处理脚本,以获取昨天的日期。

到目前为止,我已经设法写了#34;得到日期"部分,如下:

powershell $date=Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyyMMdd')

如何将$date变量传回批处理脚本,以便我可以使用$date变量来移动文件?我想在这里实现的目标如下:

move *%date%*.xml D:\Sample\

我想在一个批处理脚本中完成此任务。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你想编写一个使用Powershell获取上一个日期的批处理脚本(.bat)。

以下是您可以在.bat脚本中添加以获取值的内容。

powershell -Command (Get-Date).AddDays(-1).ToString('yyyyMMdd')

需要“传回”变量。相反,您只需将powershell的输出调用所需的信息即可。使用您发布的代码,没有输出。但是,使用上面的内容将等同于“返回”代码中的$date变量。

但是,

Batch实际上没有一种简单的方法来捕获变量。捕获变量有两种主要方法。您要么使用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%

答案 1 :(得分:1)

您可以按如下方式运行PowerShell命令行,以获取批处理脚本中变量的值:

-o

您不应该命名变量@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\ ,因为这是变量CMD会自动填充当前日期。见%date%

  

%DATE% - 使用与DATE命令相同的格式扩展到当前日期。

但是,正如@alroc在您的问题的评论中所建议的那样,在PowerShell中编写整个脚本可能更简单:

help set

答案 2 :(得分:0)

你可以完全在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