在Powershell中一个接一个地执行txt文件中的所有语句列表

时间:2018-07-28 20:00:57

标签: powershell

execute.txt-每行都有执行语句列表,如下所示。

Get-Content "C:\execute.txt" | foreach { "Intofile_1" + $_ }| Set-Content "C:\execute_file1.txt"

Get-Content "C:\execute.txt" | foreach { "Intofile_2" + $_ }| Set-Content "C:\execute_file2.txt"

我想调用execute.txt文件并一次执行所有命令/语句。

请问您如何在Powershell上实现

2 个答案:

答案 0 :(得分:2)

Get-Content读取指定的(文本)文件,而不会执行任何内容;为了执行C:\execute.txt 中包含的语句,您有两种选择

  • 任一按照Ansgar Wiechers的建议将C:\execute.txt重命名为C:\execute.ps1 ,然后调用重命名的文件(直接或使用&,除非您需要“点外包”(请参阅​​下面的背景信息)):

    & "C:\execute.ps1" | ... # Note the *.ps1 extension
    
  • :如果由于某种原因而无法重命名文件,则可以将Get-ContentInvoke-Expression 结合以实现执行:

    # PSv3+:
    # -Raw reads the entire file into a single string
    & { Invoke-Expression (Get-Content -Raw C:\execute.txt) } | ...
    
    # PSv2:
    # -Raw is not available, so the array of lines returned by Get-Content must
    # be joined with newlines ("`n"`) to form a single string first.
    & { Invoke-Expression ((Get-Content C:\execute.txt) -join "`n") } | ...
    
    • 请注意在& { ... }调用周围使用Invoke-Expression,这可以确保语句在 child 范围内执行,这是必要的,因为Invoke-Expression总是执行 calling 范围内的语句;如果您确实需要“点源”,请省略此包装。

背景信息

  • Windows PowerShell在设计上不会直接执行存储在*.txt文件中的语句。

  • 事实上, 文件扩展名被PowerShell识别为包含PowerShell script (一系列可执行语句)为*.ps1

  • 脚本文件有两种基本调用方式(在所有情况下,引用脚本文件时都可以指定.ps1扩展名)

    • 范围内(典型情况):

      • 通过 &,呼叫运算符,可以始终使用,但是如果脚本文件名/路径为 >用单引号或双引号或通过变量 指定:
        • 例如& './my script.ps1'& $script
      • 直接 ,用于指定为 literal 且没有单引号或双引号的文件名/路径
        • 例如./myscript.ps1
    • 呼叫(当前)范围中,使用“。dot-sourcing”运算符.

      • 例如. ./myscript.ps1-请注意.和脚本路径之间必须有空格
    • 关于范围界定的差异

      • child 范围内执行(运算符& /直接执行)意味着脚本中定义的变量,函数和别名对于脚本执行而言是本地的,并且会消失脚本结束时的作用域范围,而不会影响调用范围。
        通常这就是您想要的:让脚本执行其任务而不会对调用者的状态产生副作用。

      • calling 范围(操作符.)中执行意味着脚本中定义的变量,函数和别名成为该范围的一部分,甚至在脚本执行结束后仍然保留。
        这通常用于向调用范围内添加函数和别名,以供以后使用,并且与隐式地用于通过用户的配置文件向交互会话中添加自定义函数和别名的机制相同。 ,$PROFILE

      • 在调用 PowerShell脚本时,.&之间的差异很小。您可以使用任一运算符执行外部程序打开文档,在这种情况下,它们的行为都相同。


答案 1 :(得分:0)

Ansgar Wiechers的回答正确;将execute.txt-重命名为execute.ps1,然后调用该文件。 如果您确实坚持要保留名称,或者,重命名后,可以“点源”文件:. "execute.ps1"或显式调用它:& "execute.ps1"。参见SS64 on dot-sourcing,另请参见calling;他们做类似的事情时,有一些重要区别。