本帖最后由 Nsqs 于 2023-8-26 11:06 编辑
回复 Nsqs
Five66 发表于 2023-8-25 21:15 
首先,PowerShell语法规则,先做一个熟悉的过程,任何编程语言都需要熟悉的过程,刚开始接触都是这样,但是基本上都是互通的,会一个其他都能会,其次,因为你可能只接触过bat脚本,并未接触其他语言,bat脚本算是编程的一个比较新手的入门级脚本,但算不上是一个能够给进阶的编程语言打基础的脚本语言,所以才造成你学习其他语言就会感觉有点吃力,因为其他的高级语言新内容会很多,所以学习量会比较大,什么都需要重新开始接触.
至于你上面那一堆问题,其实都是很好解决的.网上资料虽然少,但是你真当我们这些学PowerShell是怎么学来的?都是通过不休不眠的熬夜学习学出来的,通过不断的测试代码,了解代码,不懂就百度的原则去学会的.
关于你的问题:
1.
(if (0 -eq 0){})
跟
if (0 -eq 0){}
不同
答:
没谁一开始就知道这是个什么原理或是为什么会这样,先说一下bat的概念,在bat中括号括起来的代码会被当做代码块来处理(你可以理解为将一串代码分成组就跟Photoshop几张图片需要合并成一张图层一个意思)
其次我们来分析PowerShell,PowerShell在括号内会被当做是数组,而直接使用if(...){...}会报错.
同理,你写成这样:
(100;200) # 一样也会报错,但你写成(100,200),用逗号则不会报错,因为这才是正确的使用方式,同理用字符串也是一样的('hello','world')
不管怎么说,是使用者可能用了不恰当的方式或者你之前想着用bat的代码逻辑带入进来.那肯定是错的了.因为PowerShell里() 括号的作用就是将数据分为一组来用,和bat一样,但不同的是他是数组,明白吗?
你可以理解为在PowerShell里是一种严格模式,语法逻辑不严谨造成的错误,同理像在Excel里的vba的写法也不能带入到PowerShell里或C#里比如说
(A>10) * (B<10)这样的逻辑放在PowerShell里应该这样写 ($A -gt 10) -and ($B -lt 10) 但是却不能写成($A -gt 10) * ($B -lt 10),但是可以写成($A -gt 10) + ($B -lt 10)这是为什么呢?
根据PowerShell里的相关错误和一般使用情况的逻辑分析前面一个括号我们看作是A,后面的括号我们看作是B.
A与B其实被括号括起来后是一组bool类型但是用*直接去乘则会出错,因为数字计算无法计算bool类型的数据需要转换数据类型写成[int]($A -gt 10) * [int]($B -lt 10)
那为什么($A -gt 10) + ($B -lt 10) 不会报错呢?那是因为在PowerShell中与C#一样+号有充当连接符的作用,但个人不建议经常拿来用,因为你有可能会在用+号的时候分不清什么时候该用什么时候不该用,因为+号并不完全等同于-and.
-and是真正意义上的"和"逻辑,而"+"是1+1=2的逻辑.在VBA中很多语法你写的不严谨"它",都不会报错,是因为VBA已经自动为你将数据类型转换好了,有很"贴心的"多自动化处理步骤,如果你放在C#里就是相当严格的模式,少一步处理都会出错,这个处理过程就不能像VBA一样可以忽略,需要手动去处理,同理我们回到主题.像()在括号内写代码只能允许是一组数据(我再三强调是数组,它是数组!!),如果你想要在括号()里面写命令或者if、for等语法则不可以直接在括号里写,同样的道理,你写成(foreach($i in 1..10){$i})一样也是会报错的
那么我们应该怎么去正确使用代码分组呢?
很简单,在括号前面加一个@,也就是@(写代码)
当你在前面加了@后,你再用 @(foreach($i in 1..10){$i}),甚至是你提到的@(if (0 -eq 0){}),他都不再提示错误了.
你甚至在前面加@后,在括号内()你可以更自由,更随意的使用各种类型的代码或方式比如:- @(
- if (0 -eq 0){}
- @(foreach($i in 1..10){$i})
- 1
- 2
- 3
- )
复制代码 但是你会发现一个问题,比如:这肯定不会报错,是正常写法,但当我写成则会出错,这是为什么呢?因为括号被括起来会被当作是数组.数组的话,数据与数据之间必须以逗号分隔,例如:则不会报错,但是我写成这样也太麻烦了,不加没一行都必须加逗号就会比较麻烦,是我的话,我何不直接写成(1,2,3)呢?或者写成毕竟@()在括号前面加了@后,代码就自由多了,基本不会再报错了,也不需要加麻烦的逗号了.
并且每一行都会被当作是数组中的一个元素
那么@的逻辑是什么呢? 是什么用法呢?
关于@的使用方法相当的多
这里只简单说明你提到的问题,
@在PowerShell里可以是一组表达式.(圈重点:可以看作是一组表达式) |