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上实现
答案 0 :(得分:2)
Get-Content
仅读取指定的(文本)文件,而不会执行任何内容;为了执行C:\execute.txt
中包含的语句,您有两种选择:
任一:按照Ansgar Wiechers的建议将C:\execute.txt
重命名为C:\execute.ps1
,然后调用重命名的文件(直接或使用&
,除非您需要“点外包”(请参阅下面的背景信息)):
& "C:\execute.ps1" | ... # Note the *.ps1 extension
或:如果由于某种原因而无法重命名文件,则可以将Get-Content
与Invoke-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
./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;他们做类似的事情时,有一些重要区别。