无意中学了点 powershell ,惊了, 这东西是不是低估了

2023-08-27 14:48:57 +08:00
 iorilu

以前以为 shell 都是 bash 之类那种

来来回回就是调点命令,用管道串联几个命令

来来回回都是处理文本, 别提多麻烦, 还有一些诡异语法之类的 awk

大家都默认这样就不错

最近因为一些用途, 了解了点 powershell

立马惊了,powershell 命令输出的都是真正的对象, 直接 相当于管道处理对象, 不需要折腾命令数着几列到几列处理文本, 既然是对象, 直接拿属性, 调用方法都行, 方便太多

而且 powershell 现在跨平台, 开源了, 感觉微软一出手, 开源真没人玩的过啊

我打算以后 mac , 或 linux 上也用 powershell 了

有兴趣的可以了解下

19813 次点击
所在节点    程序员
135 条回复
liuidetmks
2023-08-28 12:03:26 +08:00
没深入了解 ps ,
如果是第三方程序,如何传输对象呢?是不是还得看文档

如果是文本的话,自己看就可以大概处理了
e3c78a97e0f8
2023-08-28 15:51:45 +08:00
@qishouvip2022 你学透了就觉得高效,对于没接触过的人这学习成本太高了。
sky96111
2023-08-28 16:00:43 +08:00
@sky96111 看评论怎么感觉大家的 shell 更多是作为脚本解释器来使用,而不是交互使用呢?
iorilu
2023-08-28 16:30:59 +08:00
@liuidetmks 我也没深入了解

但有很多三方模块可以安装

https://www.powershellgallery.com/

都可以传对象的, 应该是按规范编码, 就可以传自定义对象

powershell 模块一般都有不错的帮助文件
vhwwls
2023-08-28 16:52:08 +08:00
@iorilu 你低估了 Linux 生态对 bash 的依赖性,有大量的各种各样的脚本只能跑在 bash 上,你可以在 Linux 上把 powershell 当成默认 shell 用一段时间,就知道为什么这玩意注定没办法替代 bash 了。
NessajCN
2023-08-28 16:52:42 +08:00
@qishouvip2022 find /your/path -type f -name '*test*.doc' -mtime 3
leeg810312
2023-08-28 17:51:50 +08:00
从功能来说,我觉得 powershell 是很强大的,只是从生态和习惯角度,不易被非 windows 平台用户接受,而且由于生态,跨平台兼容性也是在运行时,有些部署运维脚本不方便用,只有 sh 脚本。另外还有就是微软产品鄙视党了,这已经超出技术范围了。
antonius
2023-08-28 18:00:34 +08:00
强大确实是强大,复杂也是真的复杂。个人感觉 bash 和 zsh 恰好处于 cmd 和 powershell 的中间的状态,重要的是命令短,交互输入也比 powershell 简洁方便。
sariya
2023-08-28 18:07:00 +08:00
可能是没系统学过,总觉得 ps 的命令参数形式摸不着头脑
LindsayZhou
2023-08-28 22:08:16 +08:00
@zictos #6 单行里面写循环我一般习惯用 map
python -c "list(map(lambda i: print(i) if i<10 else None, range(100)))"
这样
zictos
2023-08-29 04:40:40 +08:00
@LindsayZhou 我那是举例,主要是说明无论多复杂的代码或多重嵌套都可以写成单行命令,单行字符串加 exec 函数
msg7086
2023-08-29 07:08:09 +08:00
「强大」不总是好事。这就像问,汇编速度又快功能又强,什么都能做,又什么都做得很快,为什么不是人人都用呢。那总是有短板的,学习曲线高。为什么用 bash 之类的 shell ,就是因为输入输出功能「不强大」,是纯字符串,所以只要记住字符串处理,而非记住所有的对象结构,学习难度差很多。

就像 unix 下的设计原则,万物都是文件一样。你看到 windows 的设计,哇什么都是对象。但是每个对象都有自己的结构,而文件呢,任何 linux 工具都能够轻松处理。

什么东西都是字符串有一个好处,就是进程间通讯会简单很多。如果你在 powershell 里调用第三方程序,返回的还是字符串,又不会是对象。

如果要处理更复杂的逻辑,那直接用 python 就好了,Linux 一般都内置了,Windows 下安装也简单。
iorilu
2023-08-29 08:47:50 +08:00
@sariya 没把 ,我觉得比 bash 标准的那套规范多了

ps 没有- , -- 两种参数指示的区别, 只有单 -

而且命令的位置参数, 可选参数很清楚

另外参数不用写全, 写头几个字母也行

基本符合现代编程语言参数的调用规范
mark2025
2023-08-29 09:08:31 +08:00
@eagleoflqj 给你推荐个 google 开发的 npm 包 zx

我现在项目脚本、运维脚本全是 ts/mts 格式。
用 zx 这个包来运行系统原生命令很方便(不需要自己再重复地 spawn/fork )比如
```ts
const { stdout } = await $`git pull origin`
console.log({ stdout })
```
最方便的是以前在 shell 里面处理循环、字符串、数组很麻烦,现在用 js 来弄太方便了。
**最重要的是脚本有类型保护,开发效率、维护成本(比 py )极大地提高。**

全局装个 tsx 包 www * npmjs * com / package / tsx
然后在 ts 脚本第一行添加
```ts
#!/usr/bin/env tsx
```
也可以用 `ts-node` 当执行器,全局安装然后 `Hashbang` 改为
```ts
#!/usr/bin/env ts-node-esm
```

就可以象执行普通 sh 一样执行这个脚本了(并且不需要 tsconfig.json 配置文件)
mengzhuo
2023-08-29 10:15:26 +08:00
说兼容性好的,psh 连 win2019 server 都不支持,我一个写好的 bash 脚本却可以一直用
市场早就用脚投票了
stcQ2G13k9yxep40
2023-08-29 10:58:36 +08:00
@NessajCN 这个是 bash 吗?而且上面 powershell 是面向对象的,命令输出的是一个数组,可以很方便的遍历每一个文件,然后做修改文件名,复制,删除等操作。
stcQ2G13k9yxep40
2023-08-29 11:00:41 +08:00
@mengzhuo 你确定用过 powershell 吗? win server2008 都支持(好像是支持 v3 ),2019 怎么会不支持。
stcQ2G13k9yxep40
2023-08-29 11:04:00 +08:00
好多人只是简单了解了一下,命令没写过几行,对基本的用法和特性都不了解,就武断的下结论。至少写上一两百个脚本或者几十个小程序以后,再做点评吧。
stcQ2G13k9yxep40
2023-08-29 11:07:35 +08:00
@e3c78a97e0f8 每天一小时,30 天就可以完全掌握,这还是对于小白。如果有其他脚本或变成经验,两三天就可以完全上手。
NessajCN
2023-08-29 11:10:38 +08:00
@qishouvip2022
敢情你不懂 shell 命令就来说 powershell 比 bash 好用了啊....
你说的这些都是最基本最基本的操作了
譬如还是上面的命令,你要删除就加个 -exec rm {}
find /your/path -type f -name '*test*.doc' -mtime 3 -exec rm {} \;
改名
find /your/path -type f -name '*test*.doc' -mtime 3 -exec mv {} new{} \;
复制
find /your/path -type f -name '*test*.doc' -mtime 3 -exec cp {} new{} \;

你自己对比谁方便吧

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

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

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

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

© 2021 V2EX