<p>不言而喻,实现这一目标有很多方法。您可能根本不需要函数,因为这些文件可以直接通过管道传输到<code>ForEach-Object</code>循环。无论如何,如果我们正在使用一个函数,我将首先将由<code>Get-ChildItem</code>生成的<code>[FileInfo]</code>对象集合发送给该函数。这是在扩展的地方</p>
<p>可能看起来像这样:</p>
<pre><code>Function DeplacerDansBonDossier {
param (
$Files
)
foreach ( $file in $files ) {
$extn = $File.Extension
if ($extn -eq ".txt" ) {
Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Documents"
}
elseif ($extn -eq ".mp3" ) {
Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Musique"
}
elseif ($extn -eq ".wav" ) {
Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Musique"
}
elseif ($extn -eq ".mp4" ) {
Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"
}
elseif ($extn -eq ".mkv" ) {
Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"
}
}
} # End Function DeplacerDansBonDossier
</code></pre>
<p>在您的演示代码中,您有扩展名,但是您手头上没有文件对象,因此没有任何东西可以移动</p>
<p>另一个使用switch语句的变体@AbrahamZinala建议:</p>
<pre><code>Function DeplacerDansBonDossier {
param (
$Files
)
foreach ($file in $files) {
$extn = $File.Extension
Switch ($extn)
{
'.txt' { Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Documents"; Break }
'.mp3' { Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Musique"; Break }
'.wav' { Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\Musique"; Break }
'.mp4' { Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"; Break }
'.mkv' { Move-Item -Path $File -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"; Break }
}
}
} # End Function DeplacerDansBonDossier
$Files = Get-ChildItem -Path C:\temp\SourceFolder
DeplacerDansBonDossier $Files
</code></pre>
<p>显然<code>Switch</code>使事情更简洁,但没有描述性。另外,请注意<code>break</code>语句。与<code>If\ElseIf</code>不同的是<code>Switch</code>语句将计算多个条件和脚本块。我们用<code>Break</code>停止这种行为</p>
<p>不是多余的,但这里还有很多事情可以做。例如,我们可以通过管道启用函数,以便它可以在<code>Get-ChildItem</code>之后立即通过管道传输,但考虑到前面提到的<code>ForEach-Object</code>的潜力也会运行得差不多,这可能不值得</p>
<p><strong>带有<code>ForEach-Object</code>的示例:</strong></p>
<pre><code>Get-ChildItem -Path C:\temp\SourceFolder |
ForEach-Object{
foreach ( $file in $files ) {
$extn = $File.Extension
if ($extn -eq ".txt" ) {
Move-Item -Path $_ -Destination "C:\Users\dgoud\Desktop\TP4\Documents"
}
elseif ($extn -eq ".mp3" ) {
Move-Item -Path $_ -Destination "C:\Users\dgoud\Desktop\TP4\Musique"
}
elseif ($extn -eq ".wav" ) {
Move-Item -Path $_ -Destination "C:\Users\dgoud\Desktop\TP4\Musique"
}
elseif ($extn -eq ".mp4" ) {
Move-Item -Path $_ -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"
}
elseif ($extn -eq ".mkv" ) {
Move-Item -Path $_ -Destination "C:\Users\dgoud\Desktop\TP4\VidBo"
}
}
}
</code></pre>
<p>注意:我不会在<code>ForEach-Object</code>脚本块中使用<code>Switch</code><code>$_</code>在<code>Switch</code>上下文中的操作不同</p>
<p>注:所有这些都未经测试。您可能需要对<code>-Path</code>参数使用<code>.FullName</code>属性,可以是<code>$File.FullName</code>或<code>$_.FullName</code>。<code>*-Item</code>cmdlet可能会以这种方式过于挑剔</p>