PowerShell远程执行本地脚本的核心是将脚本内容传入远程会话内存中运行,避免依赖远程磁盘文件;常用方式为Invoke-Command配合$using:传递Get-Content -Raw读取的脚本字符串,再用Invoke-Expression执行;持久会话可分步加载复用状态;UNC路径调用受限较多,不推荐。
powershell 中在远程会话中执行本地脚本,关键在于**不依赖远程磁盘上存在该脚本文件**,而是将脚本内容传入远程会话,在内存中加载并运行。这避免了手动复制文件、权限问题和清理残留的麻烦。
用 Invoke-Command + $using: 传递脚本内容
这是最常用、最稳妥的方式。PowerShell 会把本地变量内容序列化后传给远程会话,再在远程上下文中执行。
- 先读取本地脚本为纯文本(-Raw 确保换行和格式不被破坏)
- 通过 $using: 语法把字符串注入远程 ScriptBlock
- 用 Invoke-Expression 或 [ScriptBlock]::Create().Invoke() 执行
示例:
```powershell$scriptContent = Get-Content .deploy.ps1 -Raw
Invoke-Command -ComputerName Server01 -ScriptBlock {
Invoke-Expression $using:scriptContent
}
用 New-PSSession 持久会话中分步加载
适合需要多次交互、或脚本依赖远程环境初始化(如设置变量、导入模块)的场景。
- 先创建持久 PSSession:$s = New-PSSession -ComputerName Server01
- 把脚本内容作为变量传入:Invoke-Command -Session $s -ScriptBlock { $code = $using:scriptContent }
- 再执行:Invoke-Command -Session $s -ScriptBlock { Invoke-Expression $code }
这样可在同一会话中复用变量、函数或中间状态。
直接执行本地脚本路径(需远程可访问)
如果本地脚本所在路径对远程机器是 SMB 共享(如 \192.168.1.100scripts un.ps1),且远程有读取权限,也可直接调用:
```powershellInvoke-Command -ComputerName Server01 -ScriptBlock {
& "\192.168.1.100scripts un.ps1"
}
注意:此方式要求远程系统能解析该 UNC 路径,且执行策略允许网络路径脚本(如 RemoteSigned),实际限制较多,不如内存加载灵活可靠。
补充:执行前确保远程环境就绪
无论哪种方式,远程目标机必须满足基础条件:
- 已启用 PowerShell 远程处理(Enable-PSRemoting -Force)
- 本地用户在远程机上有管理员权限或 Remote Management Users 组成员身份
- 防火墙放行 WinRM 端口(默认 5985/5986)
- 远程执行策略至少为 RemoteSigned(可通过 Invoke-Command 临时绕过,但不推荐长期禁用安全策略)


















