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



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 上实现吗

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调用周围使用& { ... },这确保了语句在作用域中执行,这是必要的,因为Invoke-Expression总是在calling范围中执行语句;如果您确实需要"点源",请省略此包装

背景信息

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

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

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

    • 范围中(典型情况(:

      • 通过&,调用运算符,始终可以使用,但如果脚本文件名/路径是单引号或双引号或通过变量指定,则是必需的
        • 例如& './my script.ps1'& $script
      • 直接 ,对于指定为文本的文件名/路径,不带单引号或双引号:
        • 例如./myscript.ps1
    • 调用(当前(范围中,使用"点源"运算符.

      • 例如,. ./myscript.ps1-注意.和脚本路径之间需要一个空间
    • 关于范围界定方面的差异

      • 作用域中执行(运算符&/直接执行(意味着脚本中定义的变量、函数和别名在脚本执行时是本地的,并且在脚本结束时超出作用域,而不会影响调用作用域
        这通常是您想要的:让脚本在不影响调用方状态的情况下执行任务。

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

      • .&之间的差异仅体现在调用PowerShell脚本时;您可以使用其中一个运算符来执行外部程序打开文档,在这种情况下,它们的行为相同。


Ansgar Wiechers有正确的答案;将execute.txt-重命名为execute.ps1,然后只调用该文件如果您真的坚持保留名称,或者,在重命名后,您可以"点源"文件:. "execute.ps1"或显式调用它:& "execute.ps1"。参见SS64关于点源和呼叫;虽然他们做的事情相似,但有重要的区别。

最新更新