请求分享从BAT/CMD调用本地PowerShell会话并交互的语法
批处理调用PowerShell并实现双向信息交互
基础本地调用语法
在批处理中直接调用PowerShell执行原生cmdlet或脚本,核心语法如下:
- 执行单行PowerShell命令:
powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem C:\Temp"
参数说明:
-NoProfile:不加载PowerShell配置文件,避免额外配置干扰-ExecutionPolicy Bypass:临时绕过执行策略(仅本次会话生效,符合本地执行的安全限制)-Command:指定要执行的PowerShell命令内容调用本地PowerShell脚本文件:
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\YourScript.ps1"
批处理与PowerShell的信息互传
1. 批处理向PowerShell传递数据
可以通过命令行参数或环境变量传递:
- 命令行直接传参:
set "TARGET_PATH=C:\Windows\System32" powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Item '%TARGET_PATH%'"
- 环境变量传递:
set "SERVICE_NAME=wuauserv" powershell -NoProfile -ExecutionPolicy Bypass -Command "(Get-Service $env:SERVICE_NAME).Status"
2. 捕获PowerShell输出到批处理变量
使用for /f命令捕获PowerShell的标准输出,赋值给批处理变量:
@echo off setlocal enabledelayedexpansion :: 执行PS命令并捕获结果 for /f "delims=" %%i in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "(Get-Process | Where-Object {$_.Name -eq 'notepad'}).Id"') do ( set "NOTEPAD_PID=%%i" ) :: 根据捕获的结果执行后续逻辑 if defined NOTEPAD_PID ( echo 记事本进程ID:!NOTEPAD_PID! ) else ( echo 未找到记事本进程 ) endlocal
3. 通过状态码实现批处理逻辑分支
在PowerShell中用exit返回自定义状态码,批处理通过%errorlevel%获取并判断:
@echo off powershell -NoProfile -ExecutionPolicy Bypass -Command "if (Test-Path 'C:\Temp') { exit 0 } else { exit 1 }" if %errorlevel% equ 0 ( echo 目录C:\Temp存在 ) else ( echo 目录C:\Temp不存在 )
内容的提问来源于stack exchange,提问作者Nana
相关产品推荐
相关产品推荐

