Powershell If/Then-Then即使在条件为false时也执行
下面是一个包含jpg的文件夹,将文件名替换为nnnZ.jpg,如果图像是横向的,则跳过一个数字 我在上看到了示例,看起来if语句或条件($w-gt$h)的语法没有问题,但是每次都会执行“then”,即使文件夹中只有一个图像是纵向的。$w和$h的值是正确的(根据echo),所以我不明白出了什么问题 编辑:或者这些值实际上是字符串,这就是%s的意思吗Powershell If/Then-Then即使在条件为false时也执行,powershell,Powershell,下面是一个包含jpg的文件夹,将文件名替换为nnnZ.jpg,如果图像是横向的,则跳过一个数字 我在上看到了示例,看起来if语句或条件($w-gt$h)的语法没有问题,但是每次都会执行“then”,即使文件夹中只有一个图像是纵向的。$w和$h的值是正确的(根据echo),所以我不明白出了什么问题 编辑:或者这些值实际上是字符串,这就是%s的意思吗 Get-ChildItem | foreach { $w=$(magick identify -format '%w' $_) $h=$(ma
Get-ChildItem | foreach {
$w=$(magick identify -format '%w' $_)
$h=$(magick identify -format '%h' $_)
$flag="false"
if ($w -gt $h) {
$c++
$flag="true"
}
$newname = "$($c)Z.jpg".Padleft(8,'0')
Rename-Item $_ -NewName $newname
$c++
echo $w $h $flag $c
}
为了避免出现另一个“未回答”的问题,以下是我的评论作为回答:
$w=$(magick-identification-format'%w'$\u)
和$h=$(magick-identification-format'%h'$\u)
的代码生成字符串,而不是整数值
使用
[int]$w = $(magick identify -format '%w' $_)
[int]$h = $(magick identify -format '%h' $_)
所以这个比较会达到你的预期
如上所述,在上面的几行中,
$()
是不需要的,尽管它对获得结果没有害处。基本上,一个简单的
()
分组表达式表示“先执行此部分”,而子表达式$()
表示“先执行此部分,然后将结果作为变量处理”。它可以包含多个分号代码>分隔语句
如果需要获取宽度和高度的文件都是BMP、GIF、JPEG、PNG或TIFF类型,则不需要使用外部应用程序(如ImageMagick)来获取大小,因为.NET类可以很好地处理这些文件:
# open the image file
$img = [System.Drawing.Image]::FromFile($_.FullName)
$w = $img.Width # these are Int32 values
$h = $img.Height
# dispose of this image object
$img.Dispose()
所以magick标识-格式“%w”$\ucode>产生什么?看起来$w
和$h
的返回值是字符串,而不是整数值(将[int]
放在前面)。@Theo Bingo,thanks@rchivers如果你不介意的话,我现在就把这个贴出来作为答案,所以这个问题不会一直没有答案(不幸的是,…)@mklement0$s是做什么的?我从某处或其他地方得到了那一行,并复制了整个内容。@rchivers,请参阅Theo的更新,但我要补充的是,$(…)
只在两种情况下需要:如果需要嵌入整个语句,特别是条件语句和循环语句,或将任何表达式或语句嵌入可扩展(插值)字符串“…”
。赋值RHS上的单个语句甚至不需要(…)
,分组运算符,其本身足以嵌套单个命令或表达式。虽然不太可能,但不必要地使用$(…)
可能会产生副作用-请参阅。