Powershell &美元。扩展-eq";没有按预期工作?
我试图编写一个小脚本来自动创建mp3/mp4文件的几十个文件夹/子文件夹的播放列表(m3u),同时省略其中的各种其他杂项文件。我对Powershell知之甚少,但成功地拼凑出了一些几乎可以工作的东西。唯一的问题是,当我使用“$\.extension-eq”时,它似乎不起作用,或者至少我没有正确使用它。例如,如果我使用它来匹配临时文件夹中的log/txt文件,它可以工作,但在本例中不行。这是代码-Powershell &美元。扩展-eq";没有按预期工作?,powershell,Powershell,我试图编写一个小脚本来自动创建mp3/mp4文件的几十个文件夹/子文件夹的播放列表(m3u),同时省略其中的各种其他杂项文件。我对Powershell知之甚少,但成功地拼凑出了一些几乎可以工作的东西。唯一的问题是,当我使用“$\.extension-eq”时,它似乎不起作用,或者至少我没有正确使用它。例如,如果我使用它来匹配临时文件夹中的log/txt文件,它可以工作,但在本例中不行。这是代码- $pathname = read-host "Enter path" $root = Get-Chi
$pathname = read-host "Enter path"
$root = Get-ChildItem $pathname | ? {$_.PSIsContainer}
$rootpath = $pathname.substring(0,2)
Set-Location $rootpath
Set-Location $pathname
foreach($folder in $root) {
Set-Location $folder
foreach($file in $folder) {
$txtfile =".m3u"
$files = gci | Where-Object {$_.extension -eq ".mp3" -or ".mp4"}
$count = $files.count
if($count -ge 2){
$txtfile = "_" + $folder.name + $txtfile
Add-Content $txtFile $files
}
}
if(test-path $txtFile){
Add-Content $txtFile `r
}
Set-Location $pathname
}
我尝试过几种变体,比如用“-match”替换“-eq”,但没有成功。顺便说一句,如果我从括号中省略“-或“.mp4”,那么它可以正常工作,但我需要它同时匹配这两个,并且只匹配这两个mp3/mp4
提前谢谢。至于您对扩展的抱怨,让我们从它开始。大概代码中有一个bug;此表达式/语法在技术上有效:
$_.extension -eq ".mp3" -or ".mp4"
但显然,其目的是:
$_.extension -eq ".mp3" -or $_.extension -eq ".mp4"
首先尝试正确的表达式。如果您抱怨扩展,让我们从它开始。大概代码中有一个bug;此表达式/语法在技术上有效:
$_.extension -eq ".mp3" -or ".mp4"
但显然,其目的是:
$_.extension -eq ".mp3" -or $_.extension -eq ".mp4"
首先尝试更正的表达式。我将添加此选项作为快捷方式选项:
gci | Where-Object {".mp3",".mp4" -eq $_.extension}
我将添加此选项作为快捷方式选项:
gci | Where-Object {".mp3",".mp4" -eq $_.extension}
非常感谢你。现在效果很好!非常感谢你。现在效果很好!我认为运算符
-contains
会更好:它不会产生混淆的布尔值(示例中的-eq
不是这种情况),并且可能会更有效(它会在第一个找到的项处停止)。但是这个想法本身是好的,扩展可以定义为一个数组$extensions
,然后我们可以做这个简单的布尔检查:$extensions-包含$\ux。extension
-eq也支持数组,所以我想不出有什么区别。区别很微妙,但它是存在的。1) -eq
返回示例中的字符串(如果存在);一般情况下,它返回匹配项的数组。这根本不是布尔值。2) 根据定义-eq
必须扫描所有项目,即使已经找到一个项目。总而言之:-eq
看起来比-contains
更重。这里有一个真正不同的例子:试试这个:如果('''xxx'-eq''){'found'}其他{'notfound'}
和这个如果(''xxx'-contains'{'found'}其他{'notfound'}
。结果是不同的。是的,如果您有一个较大的集合(这里不是这种情况),则会有一些性能差异。我认为运算符-contains
会更好:它不会混淆布尔值(示例中的-eq
不是这种情况),并且可能会更有效(它停在第一个找到的项目上)。但是这个想法本身是好的,扩展可以定义为数组$extensions
,然后我们可以做这个简单的布尔检查:$extensions-包含$\扩展
-eq也支持数组,所以我想不出有什么区别。区别很微妙,但它是存在的。1)-eq
返回示例中的字符串(如果存在);一般情况下,它返回匹配项的数组。这根本不是布尔值。2) 根据定义-eq
必须扫描所有项目,即使已经找到一个项目。总而言之:-eq
看起来比-contains
更重。这里有一个真正不同的例子:试试这个:如果('''xxx'-eq''){'found'}其他{'notfound'}
和这个如果(''xxx'-contains'{'found'}其他{'notfound'}
。结果是不同的。是的,如果您有一个较大的集合(这里不是这种情况),则会有一些性能差异。