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

2023-02-18 22:09:48 +08:00
 1054850490
假如脚本名为 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 有没有类似的操作
2629 次点击
所在节点    PowerShell
16 条回复
PolarBears
2023-02-18 22:15:15 +08:00
试试 Set-Location -Path $PSScriptRoot
xiaomada
2023-02-18 22:22:44 +08:00
在目标文件所在目录,按 shift, 鼠标右键打开 powerShell 即可
1054850490
2023-02-18 22:35:49 +08:00
@xiaomada 但是必须条件是用宏打开,所以需要他自己 cd 过去
1054850490
2023-02-18 22:38:21 +08:00
@PolarBears 确实有效,但是依然不能解决遇到空格键的路径就报错
LeeReamond
2023-02-18 23:21:03 +08:00
@1054850490 试试加双引号?
NoOneNoBody
2023-02-19 00:55:21 +08:00
双引号啊,这是基本知识,跟 ps 无关
MMMMMMMMMMMMMMMM
2023-02-19 01:38:45 +08:00
如果你只是用 explorer.exe 这个壳的时候想方便一点
1. Alt+D ->自动聚焦到地址栏
2. 输入 pwsh 回车(cmd/bash/wt...都可以)

如果是编程时候引用%cd%就是你的当前目录
vvhy
2023-02-19 02:19:39 +08:00
我这里并没有空格的问题诶,要不试试:cd "$(split-path $MyInvocation.MyCommand.Definition)"或$MyInvocation.MyCommand.Definition | split-path | cd
qwq11
2023-02-19 02:24:19 +08:00
执行肯定是不行的,建议你写个函数放你 .pwshrc 里,大概是
function 888() {
cd /your/favorite/path
}
source 了之后执行 888 就行
(不过 888 好像不是一个有效的函数名)
1054850490
2023-02-19 03:40:25 +08:00
@NoOneNoBody #6 你要不要仔细审题
1054850490
2023-02-19 03:43:49 +08:00
@vvhy 也是不行,这个问题唯一解貌似就是改变量值了,至少我目前得到的答案如此
geelaw
2023-02-19 07:25:41 +08:00
@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
2023-02-19 23:25:53 +08:00
$PSScriptRoot 在 powershellISE 里不能用,楼上各位注意
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
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
2023-03-05 18:18:21 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/917240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX