1
PolarBears 2023-02-18 22:15:15 +08:00 1
试试 Set-Location -Path $PSScriptRoot
|
2
8rmEHZ8WhVHVOb0E 2023-02-18 22:22:44 +08:00
在目标文件所在目录,按 shift, 鼠标右键打开 powerShell 即可
|
3
1054850490 OP @xiaomada 但是必须条件是用宏打开,所以需要他自己 cd 过去
|
4
1054850490 OP @PolarBears 确实有效,但是依然不能解决遇到空格键的路径就报错
|
5
LeeReamond 2023-02-18 23:21:03 +08:00
@1054850490 试试加双引号?
|
6
NoOneNoBody 2023-02-19 00:55:21 +08:00
双引号啊,这是基本知识,跟 ps 无关
|
7
MMMMMMMMMMMMMMMM 2023-02-19 01:38:45 +08:00 1
如果你只是用 explorer.exe 这个壳的时候想方便一点
1. Alt+D ->自动聚焦到地址栏 2. 输入 pwsh 回车(cmd/bash/wt...都可以) 如果是编程时候引用%cd%就是你的当前目录 |
8
vvhy 2023-02-19 02:19:39 +08:00 1
我这里并没有空格的问题诶,要不试试:cd "$(split-path $MyInvocation.MyCommand.Definition)"或$MyInvocation.MyCommand.Definition | split-path | cd
|
9
qwq11 2023-02-19 02:24:19 +08:00 via Android 1
执行肯定是不行的,建议你写个函数放你 .pwshrc 里,大概是
function 888() { cd /your/favorite/path } source 了之后执行 888 就行 (不过 888 好像不是一个有效的函数名) |
10
1054850490 OP @NoOneNoBody #6 你要不要仔细审题
|
11
1054850490 OP @vvhy 也是不行,这个问题唯一解貌似就是改变量值了,至少我目前得到的答案如此
|
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 都是同一套语法。 |
13
visitantzj 2023-02-19 23:25:53 +08:00
$PSScriptRoot 在 powershellISE 里不能用,楼上各位注意
|
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 命令对未知路径加引号,不是说怎么获取这个路径 |
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 。 |
16
1054850490 OP |