$script:THIS_PATH = $myinvocation.mycommand.path $script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent function global:deactivate([switch] $NonDestructive) { if (Test-Path variable:_OLD_VIRTUAL_PATH) { $env:PATH = $variable:_OLD_VIRTUAL_PATH Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global } if (Test-Path function:_old_virtual_prompt) { $function:prompt = $function:_old_virtual_prompt Remove-Item function:\_old_virtual_prompt } if ($env:VIRTUAL_ENV) { Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue } if (!$NonDestructive) { # Self destruct! Remove-Item function:deactivate Remove-Item function:pydoc } } function global:pydoc { python -m pydoc $args } # unset irrelevant variables deactivate -nondestructive $VIRTUAL_ENV = $BASE_DIR $env:VIRTUAL_ENV = $VIRTUAL_ENV New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH $env:PATH = "$env:VIRTUAL_ENV/Scripts;" + $env:PATH if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { function global:_old_virtual_prompt { "" } $function:_old_virtual_prompt = $function:prompt if ("" -ne "") { function global:prompt { # Add the custom prefix to the existing prompt $previous_prompt_value = & $function:_old_virtual_prompt ("() " + $previous_prompt_value) } } else { function global:prompt { # Add a prefix to the current prompt, but don't discard it. $previous_prompt_value = & $function:_old_virtual_prompt $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " ($new_prompt_value + $previous_prompt_value) } } }
这段代码是 PowerShell 脚本语言的代码。它定义了两个全局变量 $script:THIS_PATH 和 $script:BASE_DIR,分别表示当前脚本文件的路径和其所在目录的路径。同时,它还定义了一个名为 deactivate 的全局函数,用于取消虚拟环境的设置。如果变量 _OLD_VIRTUAL_PATH 存在,则将环境变量 PATH 设置为该变量的值,并删除该变量。如果函数 _old_virtual_prompt 存在,则将 prompt 函数设置为该函数,并删除该函数。如果环境变量 VIRTUAL_ENV 存在,则删除该变量。如果参数 $NonDestructive 为 false,则执行上述操作,否则不执行。
$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path有误,怎么识别当前目录?
在PowerShell中,Split-Path -Parent $MyInvocation.MyCommand.Path
这个表达式的作用是获取当前脚本(.ps1
文件)所在的目录,而不是$MyInvocation
变量本身所在目录。如果 $currentPath
的赋值出错,可能是由于以下几个原因:
语法错误:检查
$MyInvocation
是否在该行之前已经定义了,它包含了关于当前运行的命令的信息。环境差异:如果是在远程会话或者跨脚本引用,可能会因为路径解析规则不同导致结果不是预期。
特殊目录:如果脚本位于特定的系统保留路径(如
<Home>
或<Temp>
),可能需要调整处理方式。
正确的做法通常应该是直接使用Get-Location
命令获取当前目录,或者使用.
来代表当前目录:
$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path
# 或者
$currentPath = Get-Location
# 或者更简单地
$currentPath = '.'
如果想确保路径字符串的准确性,可以先验证一下:
Write-Host "Current path: $currentPath"
_applicationObject.DTE.Preferences.KeyBindings.Add("MyCommand", "MyCommand", vsCommandWindowType.vsCommandWindowTypeNone);
这段代码是用在Visual Studio的扩展开发中,用于向Visual Studio的命令窗口中添加一个新的命令绑定。具体解释如下:
_applicationObject.DTE.Preferences.KeyBindings.Add("MyCommand", "MyCommand", vsCommandWindowType.vsCommandWindowTypeNone);
_applicationObject.DTE.Preferences.KeyBindings
:这是访问Visual Studio的DTE(Development Tools Environment)对象的Preferences属性的KeyBindings集合。KeyBindings集合包含了所有的键盘快捷键绑定。Add("MyCommand", "MyCommand", vsCommandWindowType.vsCommandWindowTypeNone)
:这是向KeyBindings集合中添加一个新的命令绑定。第一个参数是命令的名称,第二个参数是命令的显示名称,第三个参数是命令窗口的类型。vsCommandWindowType.vsCommandWindowTypeNone
:这是一个枚举值,表示命令窗口的类型。在这个例子中,命令窗口的类型被设置为None,意味着这个命令不会在命令窗口中显示。
通过这段代码,你可以为Visual Studio添加一个新的命令,并为其设置键盘快捷键。
相关推荐
















