如何在打开 powershell 脚本的时候, cd 到脚本所在目录 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1054850490
V2EX    PowerShell

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

  •  
  •   1054850490 2023-02-18 22:09:48 +08:00 3655 次点击
    这是一个创建于 973 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假如脚本名为 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  
       203-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     Solana     916 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 19:42 PVG 03:42 LAX 12:42 JFK 15:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86