PSCX Invoke-BatchFile 来世

PSCX Invoke-BatchFile 来世

我对 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 中指定的目录。

相关内容