如何强制Invoke-Item调用的Batch文件使用指定工作目录?
问题描述
目录结构
C: +-- Test +-- Batch + -- Foo.bat + -- Bar.bat +-- PS +-- Foo.ps1
文件内容
- Foo.bat内容:
call Bar.bat
- Foo.ps1当前调用代码:
Set-Location "C:\Test\Batch" Invoke-Item "Foo.bat"
核心问题
运行Foo.ps1时,Foo.bat实际工作目录仍是C:\Test\PS,导致找不到同目录的Bar.bat。且无法修改Foo.bat,也不能将Foo.ps1移动到Batch目录,需要强制Foo.bat以C:\Test\Batch作为工作目录执行。
解决方案
方法1:用Start-Process指定工作目录
这是最直接的方式,Start-Process可直接为被调用的批处理指定工作目录:
Start-Process -FilePath "C:\Test\Batch\Foo.bat" -WorkingDirectory "C:\Test\Batch" -NoNewWindow -Wait
-NoNewWindow:在当前控制台窗口执行,不会弹出新窗口-Wait:等待批处理执行完成后,再继续运行PowerShell脚本
方法2:直接调用cmd.exe并切换目录
通过cmd执行批处理,先切换到目标目录再运行:
cmd.exe /c "cd /d C:\Test\Batch && Foo.bat"
/d参数确保cmd能切换到不同驱动器的目录,&&保证只有切换目录成功后才执行批处理。
方法3:用Invoke-Expression整合目录切换
如果不想用Start-Process,可以把切换目录和执行批处理放在同一个子进程中执行:
Invoke-Expression "cd C:\Test\Batch; .\Foo.bat"
内容的提问来源于stack exchange,提问作者Bill Tür stands with Ukraine
相关产品推荐
相关产品推荐

