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-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
调用周围使用& { ... }
,这确保了语句在子作用域中执行,这是必要的,因为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关于点源和呼叫;虽然他们做的事情相似,但有重要的区别。