首页 > 解决方案 > 调用 powershell.exe 时,PowerShell 工作目录的定义是什么?

问题描述

编辑:这似乎是我遇到的一个非常利基的场景,但问题本身的答案是powershell.exe从调用进程继承工作目录。即PUSHD确实更改了工作目录cmd并传递给PWSH.

顺便说一句,我遇到的问题是我没有权限和访问工作目录路径中的所有文件夹。特别是在下面,我缺少\Dev\. 因此,如果我在本地映射\\<ComputerName>\<ShareName>\<NoAccessVolume>\<AccessVolume>到像我这样的驱动器H:,它可以正常工作,因为映射会跳过<NoAccessVolume>。但是,我不能简单地让 PowerShell 将我的位置设置为,\\<ComputerName>\<ShareName>\<NoAccessVolume>\<AccessVolume>因为即使 PowerShell 可以处理 UNC 路径,它也会引发与权限相关的错误。

在不了解我为什么使用批处理文件的情况下,我正在使用一个。如另一个答案所述,批处理文件(.cmd, .bat)可以直接启动,而.ps1文件则不能。

所以这是场景:

其中一位用户要么没有将其网络共享映射到本地驱动器,要么他们特意使用 UNC 路径访问网络共享。cmd.exe不喜欢这样,它警告我们将使用 Windows 目录。根据此处关于 SO 的不同答案%SystemRoot%使用了。它很容易使用PUSHDPOPD更改目录(请参阅此处cmd.exe的各种答案) - 但是,似乎并不关心临时驱动器号。所以在脚本中引用......不是一个好主意。powershell.exe$PWD

我在about_PowerShell_exe上找不到任何关于工作目录的内容 - 但很容易说,如果cmd.exe默认为 Windows 目录,那么powershell.exe也将使用C:\Windows. 但是,PUSHD在调用之前使用会powershell.exe导致 PowerShell 在C:\. 所以我想我想知道powershell.exe使用什么逻辑来确定生成的 PowerShell 工作目录,并且在我的具体情况下,是否有任何简单的选项可用于更改工作目录以匹配%~dp0(即.bat从哪里调用文件)。

我链接的第一个答案(也在这里)详细介绍了从批处理文件调用它时将参数传递给 PowerShell 的一些有用细节,所以我知道这是我可以走的一条路线 - 但是有什么隐藏的东西powershell.exe我错过了?

编辑:这是我目前得到的。我正在使用 Windows 10。

我的批处理文件的内容:

@echo OFF
echo Batch File: %0
powershell.exe -NoProfile -NoExit -Command Write-Host PowerShell Working Directory w/o PUSHD: $PWD
PUSHD "%~dp0"
powershell.exe -NoProfile -NoExit -Command Write-Host PowerShell Working Directory w/ PUSHD: $PWD
POPD
PAUSE

从映射驱动器运行;$PWD 将按预期工作:

Batch File: "H:\_Team Members\immobile2\test.bat"
PowerShell Working Directory w/o PUSHD: H:\_Team Members\immobile2
PS H:\_Team Members\immobile2> exit
PowerShell Working Directory w/ PUSHD: H:\_Team Members\immobile2
PS H:\_Team Members\immobile2> exit
Press any key to continue . . .

从网络共享运行;$PWD 将无法按预期工作

'\\dep-files01\Departments$\Dev\Data\_Team Members\immobile2'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
Batch File: "\\dep-files01\Departments$\Dev\Data\_Team Members\immobile2\test.bat"
PowerShell Working Directory w/o PUSHD: C:\Windows
PS C:\Windows> exit
PowerShell Working Directory w/ PUSHD:
PS C:\> exit
Press any key to continue . . .

标签: windowspowershellbatch-file

解决方案


推荐阅读