我对 PowerShell 还不太熟悉,所以请耐心听我说。为什么使用 PSCX 的 Invoke-BatchFile cmdlet 后 PowerShell 控制台的行为会变得奇怪?
C:\> cd
C:\> cd .\Kellekek
C:\Kellekek> cd ..
C:\>
C:\> Invoke-BatchFile 'C:\Kellekek\Microsoft Visual Studio 12.0\VC\vcvarsall.bat' amd64
C:\> cd
# Directory Stack:
--- ----------------
-> 0 C:\
C:\> cd .\Kellekek
C:\Kellekek
C:\Kellekek> cd ..
C:\
C:\>
在使用 cmdlet 之前,一切似乎都运行正常。使用之后,似乎另一个实用程序会接管“cd”并在每次调用时返回 powershell 对象,我认为这要么是一条单独的额外行(已经很烦人了),要么是看起来像“ls”的片段。
这是为什么? 有办法摆脱这种行为吗?
提前致谢,Máté
答案1
从模块运行命令会导入该模块 - 因此当您运行该命令时,您就导入了 PSCX 模块。
PSCX 将“CD”别名更改为指向其“Set-LocationEx”命令,该命令会自动跟踪位置历史记录,以便您轻松导航到以前的位置。当您调用不带参数的 Set-LocationEx 时,它们会向您显示堆栈(为什么别的无论如何,你会运行没有参数的 CD 吗?
附注:为了将批处理文件中的环境更改导入 PowerShell,我改用 PoshCode 中的此脚本:http://poshcode.org/3547
PS:它们还(默认情况下)使用 Write-Host 来回显您的新位置。您可以通过设置首选项变量来关闭该行为:
$Pscx:Preferences.CD_EchoNewLocation = $False
因为每个人都知道使用write-host 被认为是有害的,对吧?当我没有要求 -Passthru 时,用它来写出目录路径非常奇怪,所以你可以投票支持这个错误;-)
PPS:不幸的是,尽管 PSCX 创建了一个首选项驱动器,但 PSCX 似乎不会保留首选项更改(我不确定为什么,但我会看看是否能找到原因)。无论如何,为了让你的偏好为人所知,你需要编辑Pscx.UserPreferences.ps1
和然后在导入 PSCX 模块时将该文件的路径作为传入-Arg
(这意味着您不能依赖自动导入)。显然这很麻烦:
Import-Module Pscx -Arg ~\Documents\WindowsPowerShell\Pscx.UserPreferences.ps1
答案2
“显示”目录堆栈是 PSCX cd 替换的基本功能。如果您不想使用替换 CD 功能,您可以通过设置此部分来配置 Pscx.UserPreferences.ps1 文件以不加载它,如下所示:
ModulesToImport = @{
CD = $false
...
然后在导入模块时像这样传递文件路径:
Import-Module Pscx -Arg $home\Documents\WindowsPowerShell\Pscx.UserPreferences.ps1
不幸的是,您需要先显式加载 Pscx。如果您使用 PowerShell 的自动加载模块功能,PSCX 将始终使用默认值加载。
但是,在您摆脱 CD 之前,我建议您先通过 cd 尝试进入多个不同的目录,然后尝试cd -
返回 cd 历史记录中的一个目录,然后尝试cd +
向前移动。现在,当您执行时,cd
您可以看到完整的历史记录。尝试执行cd 1
以将您带到插槽 1 中指定的目录。