【问题标题】:Translate batch script to Powershell script将批处理脚本转换为 Powershell 脚本
【发布时间】:2015-04-30 20:03:37
【问题描述】:

我目前将此脚本作为计划任务运行:

@echo on
START /WAIT c:\windows\system32\Robocopy.exe "D:\folder" "\\192.168.2.87\folder" /E /MT:20 /R:50 /W:10 /V /ETA /LOG:c:\robocopy.txt

我想将其转换为 PowerShell 脚本并将其运行,原因有两个:

  • 更现代
  • 最重要的原因是我想将带有日期和时间的日志存储为C:\robocopylog3004201510214043.txt,而我实际上没有找到有关如何从批处理脚本中删除“:”和“/”等字符的信息,我知道PowerShell 可以。

最后一个数字不是随机的。这是日期和时间。

例如日期是“2015 年 4 月 30 日”(条带化会留下 30042015) 例如时间是“10:21:40,43”(剥离它会留下 10214043)

所以它会留下一个robocopylog3004201510214043.txt的文件名

【问题讨论】:

    标签: powershell batch-file


    【解决方案1】:

    在运行外部程序方面,CMD 和 PowerShell 几乎没有区别。不过,我建议使用呼叫运算符 (&),即使在这种特殊情况下它不是强制性的。

    & c:\windows\system32\Robocopy.exe "D:\folder" "\\192.168.2.87\folder" /E /MT:20 /R:50 /W:10 /V /ETA /LOG:c:\robocopy$(Get-Date -format 'ddMMyyyyHHmmss').txt
    

    robocopy 无论如何都会同步运行,因此不需要“等待”指令。

    number formatddMMyyyyHHmmss 产生一个由日、月、年、小时、分钟和秒组成的时间戳。我不建议也包括毫秒,因为您可能不会在同一秒内多次运行 robocopy。如果必须包含毫秒,请将ff 附加到格式字符串(或ffff 等,具体取决于您需要的位数)。不过,您可能需要考虑使用 ISO 日期格式 (yyyyMMddHHmmss),因为这样可以简化按创建顺序列出日志文件。

    至于替换批处理脚本中的字符,可以通过string replacements

    C:\>echo %DATE:/=%
    30042015
    
    C:\>echo %TIME::=_%
    10_01_22.39

    【讨论】:

    • 目前,批处理脚本返回的日期为“30/04/2015”和“10:21:40,43”。所以我想删除“/”,“:”和“,”。应该是 3004201510214043。我会将其添加到原始问题中。
    • & c:\windows\system32\Robocopy.exe "D:\folder" "\\192.168.2.87\folder" /E /MT:20 /R:50 /W:10 /V /ETA /LOG:c:\robocopy$(Get-Date -format 'ddMMyyyHHmmssfff').txt
    • “&”到底是干什么用的?
    • 就像我说的:这是话务员。它允许您在双引号 (& "C:\path\to\some\executable") 中运行可执行文件。如果没有调用运算符,PowerShell 将考虑引号之间的路径字符串并将其简单地回显到默认输出流。在这种特殊情况下不需要它,因为可执行文件的路径不在引号中。
    • 是的,我实际上选择了那种格式,而不是我最初评论的那种,因为它看起来更清晰。我将 MS 包括在内,因为我确实在同一秒内做了几次 robocopy。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2018-04-13
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多