PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
Windows
Re: [心得] PowerShell 那些恼人的路径 BUG
楼主:
falcon
(falken)
2024-09-28 07:47:00
: hunandy14: 其实真实的情况是 pwsh 社群决议改掉默认万用了
: hunandy14: 他不是bug就是当初设计 不符合直觉
: hunandy14: 所以应该不会修了,那是式样不是bug
: hunandy14: 测试结果确实没有bug存在,只是恼人的设计
bug 是指对于万元字符路径的跳脱处理有误
默认万元字符我只当它是反人类设计而已
https://github.com/PowerShell/PowerShell/issues/7999
主要是讲这 bug 的影响
顺便提了两句微软的鸡婆的
设计导致多余的困扰,不是本篇的重点
由于 -like 运算子跟 cmdlet 的路径参数
对于万用字符的解读不同
这两者都是 PowerShell 原生的功能
对于同样的东西应该有相同行为
所以说,在这问题上最多只能有一方是正确的
https://i.imgur.com/YiXffzL.png
如过这是特性不是 bug 的话
那工作目录中的特殊字符应该要做独特的跳脱处理
毕竟这是在 cmdlet 内部处理的
不应该发生错误
Set-Location -LiteralPath 'D:\test`[0-2]'
Resolve-Path -Path .
Resolve-Path -LiteralPath .
使用 -Path . 与使用 -LiteralPath .
前者在任何版本都会发生错误
则只有在新的跨平台版 PS 才能得到正确路径
https://i.imgur.com/m5uoXdF.png
另外,我不是说管线那设计是 bug
bug 是指在这个工作目录把程式作为命令执行
会因为因为工作目录路径导致异常行为
https://i.imgur.com/mbG9jTo.png
Start-Process 有 -WorkingDirectory 可以用
它会直接拿你跳脱处理过的路径当 base 去组出完整路径
就能避开对于工作目录路径本身包含 ` 时的问题
而 System.Diagnostics.Process 不是 PS 的 cmdlet 所以没此问题
拿 Start-Process 举例,只因为它是 PowerShell 的 Cmdlet
作者:
hunandy14
(Charlott.HonG)
2024-09-28 23:00:00
图1并不是因为解读不同导致的,而是路径相关的cmdlet会多做一次双引号的解释,这个估计是三张图的bug根源多做一次双引号用说的可能不好解释,放张图给你看
https://imgur.com/JDOS7Og.png
这个逻辑虽然无误,但是就是个反人类设计图3估计是这个设计实际引发的bug...到图2图3这一步,明显是这个设计导致的bug了摁...我认为是bug了,太脑残了这图中的档案真实路径是 "D:\test\Test`[1].txt"
楼主:
falcon
(falken)
2024-09-29 00:09:00
网络上都找好久,都没有比较全面的方案,也只能自己动手了对了,如果是 te`st`[0].txt 呢?数字部分一样用万用字符我试过两倍量 ` 不管用…感觉要改成正规表示法才可靠了
作者:
hunandy14
(Charlott.HonG)
2024-09-29 12:02:00
是这样解的
https://i.imgur.com/5E7eKjs.png
我猜你应该快摸到他的逻辑了,就是解2次双引号八成是为了区别那括号到底是字串还是万用字符写一个依照万用字符表添加反引号的函式或许能解图2应该是吃了这个亏导致的,官方cmdlet自己出bug
作者:
smallreader
(小读者)
2024-09-29 13:36:00
高手过招(眼花撩乱ing
作者:
hunandy14
(Charlott.HonG)
2024-09-29 14:07:00
试了一下 Resolve-Path 应该无解。改用GetFullPath吧
https://imgur.com/OMvYg3j
楼主:
falcon
(falken)
2024-09-29 15:06:00
这样看起来,如果以cmdlet的处理方式为准的话-like 运算子反而才是坏的,他的行为更不规律-like能够同时符合一般的跳脱规则,与cmdlet独特的规则麻烦了,不知道要按一般逻辑处理跳脱,还是照这反智规则看来只能按照一般的规则,将万用字符模式转成正规表示法还需要一个参数来决定要不要先把输入的万元字符中的``取代为单个`,这样就能在两种规则中切换
作者:
hunandy14
(Charlott.HonG)
2024-10-09 14:23:00
今天闲著把github上的讨论串都看了 2018就有了...一个可以不用自己处理逻辑的解法是这样的
https://i.imgur.com/A17ieJi.png
不过这有效范围只有到父资料夹名称
楼主:
falcon
(falken)
2024-10-09 18:04:00
我目前是将万用字符路径转成正规表示法,递回方法一层用-match运算子比对名称。结果100%可靠。但效率就不高了,递回方法只能停止从不正确的子目录继续往下寻找路径,但也要先比对过所有子目录名称,才会知道要从哪个目录往下走这能处理任何一层目录名称中的*或?的多重符合
https://i.imgur.com/ZABP3w3.png
作者:
hunandy14
(Charlott.HonG)
2024-10-09 23:04:00
我一开始有想过转发,只是也不知道如何实现就算参数能实现还有个大魔王管道没找到可靠的方法估计也只能取舍了然后就是这应该不是完全解,不然这事不会拖6年还没解
继续阅读
[交易]Microsoft Office365家用版 (已满)
holystudent
Microsoft office365家用版 征3人
with231
[交易] 额满 Windows 家用版/13个月/征1
herboy
[交易] (满员)Microsoft office365家用版
bubuQQ
[问题] 映像档制作与重灌所需工具&注意事项?
supermars
[问题] 换电脑 如何从onedrive上把资料拉回桌面
louisshih
[问题] Win10 powershell
RREvoque
[问题] Rufus安装win11的本机密码?
supermars
[问题] 工作列的新闻与兴趣
jouhouya
[交易] Microsoft 365 个人版 一年盒装版
happy1b1c
Links
booklink
Contact Us: admin [ a t ] ucptt.com