Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell &美元。扩展-eq";没有按预期工作?_Powershell - Fatal编程技术网

Powershell &美元。扩展-eq";没有按预期工作?

Powershell &美元。扩展-eq";没有按预期工作?,powershell,Powershell,我试图编写一个小脚本来自动创建mp3/mp4文件的几十个文件夹/子文件夹的播放列表(m3u),同时省略其中的各种其他杂项文件。我对Powershell知之甚少,但成功地拼凑出了一些几乎可以工作的东西。唯一的问题是,当我使用“$\.extension-eq”时,它似乎不起作用,或者至少我没有正确使用它。例如,如果我使用它来匹配临时文件夹中的log/txt文件,它可以工作,但在本例中不行。这是代码- $pathname = read-host "Enter path" $root = Get-Chi

我试图编写一个小脚本来自动创建mp3/mp4文件的几十个文件夹/子文件夹的播放列表(m3u),同时省略其中的各种其他杂项文件。我对Powershell知之甚少,但成功地拼凑出了一些几乎可以工作的东西。唯一的问题是,当我使用“$\.extension-eq”时,它似乎不起作用,或者至少我没有正确使用它。例如,如果我使用它来匹配临时文件夹中的log/txt文件,它可以工作,但在本例中不行。这是代码-

$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'}
。结果是不同的。是的,如果您有一个较大的集合(这里不是这种情况),则会有一些性能差异。