从U盘运行.bat调用.ps1时,脚本误获取C盘盘符问题排查
问题原因与解决方案
核心原因
通过批处理调用PowerShell时,PowerShell的初始工作目录并非U盘上的脚本所在目录,而是批处理文件的启动工作目录(通常是C:\Windows\System32或用户默认目录),因此Get-Location会返回C盘盘符。
解决方案
方案1:修改批处理文件,先切换到脚本所在目录
在调用PowerShell的命令前,添加切换目录的指令,确保PowerShell启动时工作目录在U盘上:
powershell.exe -noprofile -command "Set-ExecutionPolicy Bypass LocalMachine" -force cd /d "%~dp0" powershell.exe -noprofile -file "%~dpn0.ps1" %* powershell.exe -noprofile -command "Set-ExecutionPolicy AllSigned LocalMachine" -force
%~dp0代表批处理文件所在的目录路径,cd /d会同时切换盘符和目录。
方案2:修改PowerShell脚本,直接获取脚本自身所在盘符
不依赖当前工作目录,改用PowerShell内置变量$PSScriptRoot(代表当前脚本文件所在的目录)来获取盘符,这种方法更健壮,不受启动方式影响:
$DriveLetter = (Get-Item $PSScriptRoot).Drive.Name mkdir "${DriveLetter}:\Script Folder\Subfolder\Subfolder${env:computername}"
或者更简洁的写法:
$ScriptDrive = (Get-Item $PSScriptRoot).Drive mkdir "$($ScriptDrive.Name):\Script Folder\Subfolder\Subfolder${env:computername}"
额外说明
- 单独运行.ps1时,PowerShell会默认将工作目录设置为脚本所在目录,所以
Get-Location能正确获取U盘盘符;但通过批处理调用时,批处理的工作目录会被继承给PowerShell,导致路径错误。 - 方案2是更推荐的做法,因为脚本自身具备了获取正确路径的能力,无论通过哪种方式启动都能正常工作。
内容的提问来源于stack exchange,提问作者Joe R
相关产品推荐
相关产品推荐

