繁体   English   中英

使用PowerShell编写批处理文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM