V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1054850490
V2EX  ›  PowerShell

如何在打开 powershell 脚本的时候, cd 到脚本所在目录

  •  
  •   1054850490 · 2023-02-18 22:09:48 +08:00 · 2983 次点击
    这是一个创建于 668 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假如脚本名为 888.ps1
    脚本位于:C:\Users\yerin\Desktop\888.ps1
    我想要打开这个脚本的时候,运行目录可以自动 CD 到:C:\Users\yerin\Desktop

    注:我明白 pow 脚本,默认是以脚本所在目录运行的,但是我用键盘的宏定义打开 pow 脚本的时候,并不会按照之前的状态进行,打开的时候却是宏软件的目录,

    我搜索到有一个命令有作用
    ```
    cd (Split-Path -Parent $MyInvocation.MyCommand.Definition)
    ```
    这样确实会跳转到脚本所在目录,但是遇到有空格的所在目录就会报错,如何才能加上双引号括住


    以下有一个 CMD 我经常用的命令,而且碰到空格键也可以 CD 进去
    ```
    cd %~dp0
    %~d0
    ```
    这样的话 CMD 就会自己 CD 到 bat 的所在目录,我不知道 powershell 有没有类似的操作
    16 条回复    2023-03-05 18:18:21 +08:00
    PolarBears
        1
    PolarBears  
       2023-02-18 22:15:15 +08:00   ❤️ 1
    试试 Set-Location -Path $PSScriptRoot
    8rmEHZ8WhVHVOb0E
        2
    8rmEHZ8WhVHVOb0E  
       2023-02-18 22:22:44 +08:00
    在目标文件所在目录,按 shift, 鼠标右键打开 powerShell 即可
    1054850490
        3
    1054850490  
    OP
       2023-02-18 22:35:49 +08:00
    @xiaomada 但是必须条件是用宏打开,所以需要他自己 cd 过去
    1054850490
        4
    1054850490  
    OP
       2023-02-18 22:38:21 +08:00
    @PolarBears 确实有效,但是依然不能解决遇到空格键的路径就报错
    LeeReamond
        5
    LeeReamond  
       2023-02-18 23:21:03 +08:00
    @1054850490 试试加双引号?
    NoOneNoBody
        6
    NoOneNoBody  
       2023-02-19 00:55:21 +08:00
    双引号啊,这是基本知识,跟 ps 无关
    MMMMMMMMMMMMMMMM
        7
    MMMMMMMMMMMMMMMM  
       2023-02-19 01:38:45 +08:00   ❤️ 1
    如果你只是用 explorer.exe 这个壳的时候想方便一点
    1. Alt+D ->自动聚焦到地址栏
    2. 输入 pwsh 回车(cmd/bash/wt...都可以)

    如果是编程时候引用%cd%就是你的当前目录
    vvhy
        8
    vvhy  
       2023-02-19 02:19:39 +08:00   ❤️ 1
    我这里并没有空格的问题诶,要不试试:cd "$(split-path $MyInvocation.MyCommand.Definition)"或$MyInvocation.MyCommand.Definition | split-path | cd
    qwq11
        9
    qwq11  
       2023-02-19 02:24:19 +08:00 via Android   ❤️ 1
    执行肯定是不行的,建议你写个函数放你 .pwshrc 里,大概是
    function 888() {
    cd /your/favorite/path
    }
    source 了之后执行 888 就行
    (不过 888 好像不是一个有效的函数名)
    1054850490
        10
    1054850490  
    OP
       2023-02-19 03:40:25 +08:00
    @NoOneNoBody #6 你要不要仔细审题
    1054850490
        11
    1054850490  
    OP
       2023-02-19 03:43:49 +08:00
    @vvhy 也是不行,这个问题唯一解貌似就是改变量值了,至少我目前得到的答案如此
    geelaw
        12
    geelaw  
       2023-02-19 07:25:41 +08:00   ❤️ 1
    @1054850490 #4 不确定怎么会出错,因为 Set-Location 当然是支持空格的。根据我的脑波调试,你可以尝试考虑下面两个情况:

    1. 你的宏软件没有设置正确,导致 PowerShell 脚本的路径有空格的时候根本不能打开脚本,和脚本的 Set-Location 是否成功没有关系。
    2. 你的脚本所在的路径包括中括号 [],这是 PowerShell 通配符之一,因此使用 -Path 会失败。

    当然,第二个问题即使现在不是你遇到的问题,也应该避免,在不使用通配符的情况,应该尽量用 LiteralPath 提高性能并减少出错的可能。

    Set-Location -LiteralPath $PSScriptRoot

    第一个问题,你或许需要在 PowerShell 脚本的名字周围加上双引号,这和你的宏程序的具体机制有关。


    @qwq11 #9 不应该假设启动脚本的时候会运行 profile 脚本,因为可以 -NoProfile 。


    @LeeReamond #5 $PSScriptRoot 是字符串类型的变量,写成 "$PSScriptRoot" 没有任何效果,因为后者相当于是 [string]::Format("{0}", $PSScriptRoot),得到的结果必然也是 $PSScriptRoot 自己。

    @NoOneNoBody #6 和 PowerShell 当然有关,并不是所有的 shell 都是同一套语法。
    visitantzj
        13
    visitantzj  
       2023-02-19 23:25:53 +08:00
    $PSScriptRoot 在 powershellISE 里不能用,楼上各位注意
    NoOneNoBody
        14
    NoOneNoBody  
       2023-02-20 13:29:43 +08:00
    $var = Split-Path -Parent $MyInvocation.MyCommand.Definition
    cd "$var"
    好多年没写 ps 了,翻了一下备份,以前习惯是直接用$PSScriptRoot 的
    不过除了 tc 外,我没试过在三方调用脚本,感觉是也和这个三方宏有关?

    @geelaw #12
    我说的是 cd 命令对未知路径加引号,不是说怎么获取这个路径
    geelaw
        15
    geelaw  
       2023-02-28 04:47:17 +08:00
    @NoOneNoBody #14 您没有理解 PowerShell 的类型系统和传参逻辑,$PSScriptRoot 和 "$PSScriptRoot" 是完全一样的,下面两条命令只有运行效率的区别,没有效果的区别:

    cd $PSScriptRoot
    cd "$PSScriptRoot"

    如果当前脚本的完整路径是 C:\Path with Space\My Script.ps1 ,那么 $PSScriptRoot 是一个字符串,长度是 18 ,内容是 C:\Path with Space ,你写

    cd $PSScriptRoot
    cd 'C:\Path with Space'
    cd "C:\Path with Space"

    三句话的效果完全一样,而且和

    cd C:\Path with Space

    效果不一样,因为后者会被理解为想要传入三个参数,分别是 'C:\Path' 和 'with' 和 'Space'。

    而你写的

    $var = Split-Path -Parent $MyInvocation.MyCommand.Definition

    之后

    cd "$var"

    和 cd $var 的效果是完全一样的,因为 $var 已经是字符串了,此外 cd "$var" 依然有通配符的问题,正确的写法是 cd -LiteralPath $var 。
    1054850490
        16
    1054850490  
    OP
       2023-03-05 18:18:21 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5537 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:41 · PVG 14:41 · LAX 22:41 · JFK 01:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.