将bat文件转换为powershell脚本

mi7gmzs6  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(448)

我有一个简单的.bat文件,它执行一个exe文件,并在txt文件中传递一些参数。我如何在powershell脚本(.ps1文件)中实现相同的功能?

.bat文件内容:

@echo on
C:\Windows\System32\cmd.exe /C "C:\Program Files\BMC Software\AtriumCore\cmdb\server64\bin\cmdbdiag.exe" -u test -p test -s remedyar -t 41900 < "C:\Program Files\BMC Software\ARSystem\diserver\data-integration\batch\CleanupInputs.txt" > "C:\Program Files\BMC Software\ARSystem\diserver\data-integration\batch\Snow_Output\DailyOutput.log"
Exit 0
agxfikkp

agxfikkp1#

  • 从根本上说 *,在PowerShell中调用控制台应用程序的方式与在cmd.exe中相同,但有一些重要的差异:
# If you really want to emulate `@echo ON` - see comments below.
Set-PSDebug -Trace 1 

# * PowerShell doesn't support `<` for *input* redirection, so you must
#   use Get-Content to *pipe* a file's content to another command.
# * `>` for *output* redirection *is* supported, but beware encoding problems:
#     * Windows PowerShell creates a "Unicode" (UTF-16LE) file,
#     * PowerShell (Core, v6+) a BOM-less UTF-8 file.
#     * To control the encoding, pipe to Out-File / Set-Content with -Encoding
# * For syntactic reasons, because your executable path is *quoted*, you must
#   invoke it via `&`, the call operator.
Get-Content "C:\..\CleanupInputs.txt" | 
  & "C:\...\cmdbdiag.exe" -u test -p test -s remedyar -t 41900 > "C:\...\DailyOutput.log"

# Turn tracing back off.
Set-PSDebug -Trace 0

exit 0

注:

  • 为简洁起见,我将命令中的长目录路径替换为...
    *字符编码注意事项
  • 当PowerShell与 * 外部程序 * 通信时,它只“说文本”(并且它通常不会通过其管道传递 * 原始字节 *(从v7.2开始)),因此可能涉及编码和解码字符串的多次传递;具体而言:
  • Get-Content不只是将文本文件的原始字节通过路径,它将内容 * 解码 * 为 *.NET字符串 *,然后通过管道逐行发送内容。如果输入文件缺少BOM,Windows PowerShell将采用活动ANSI编码,而PowerShell(Core)7+将采用UTF-8;您可以使用-Encoding参数来明确指定编码。
  • 由于接收命令是一个 * 外部程序 (可执行文件),PowerShell(重新)- 编码 * 行,然后将它们发送到程序,基于$OutputEncoding首选项变量,默认为ASCII(!)在Windows PowerShell中,和UTF-8在PowerShell(核心)7+。
  • 由于>-实际上是Out-File的别名-用于将外部程序重定向到文件,因此会发生另一轮解码和编码:
  • PowerShell首先将外部程序的输出解码为.NET字符串,基于存储在[Console]::OutputEncoding中的字符编码,默认为系统的活动OEM代码页。
  • 然后Out-File基于 its 默认编码对解码后的字符串进行 * 编码,在Windows PowerShell中为UTF-16 LE(“Unicode”),在PowerShell(Core)中为无BOM的UTF-8;要控制编码,您需要显式使用Out-File(或Set-Content)并使用其-Encoding参数。
    另见:
  • about_Redirection
  • &,呼叫操作员
  • This answer讨论了两个PowerShell版本中的默认编码;简而言之它们在Windows PowerShell中变化很大,但PowerShell(Core)7+现在一直使用无BOM的UTF-8。
    重新执行跟踪:在批处理文件中使用@echo ON以及它与PowerShell的比较

Set-PSDebug-Trace 1

  • 批处理文件通常使用@echo OFF运行,以便在打印输出之前 * 不 * 回显每个命令本身。
  • 但是,@echo ON(或者完全省略@echo ON/OFF语句)对于在执行过程中诊断问题很有帮助。
  • Set-PSDebug -Trace 1类似于@echo ON,但它有一个缺点:命令的 * 原始源代码 * 被回显,这意味着你不会看到嵌入变量引用和表达式的 * 值 *-有关更多信息,请参阅this answer

相关问题