Shell 如何在没有硬编码变量的情况下移动项目

Shell 如何在没有硬编码变量的情况下移动项目,shell,powershell,Shell,Powershell,我想移动扩展名为.txt的项目,但不是像这样,硬编码的。我想从文件夹中选择所有具有某个扩展名的文件,并将它们移动到与扩展名同名的文件夹中。我想对目录中的所有扩展都这样做 有什么想法吗? 谢谢大家! 看看我的代码,但我是用硬编码的变量来做的 $variable=Get-ChildItem -Path "C:\somePath" foreach ($variables in $variable) { if($extension=($variables | Where {$_.extensi

我想移动扩展名为.txt的项目,但不是像这样,硬编码的。我想从文件夹中选择所有具有某个扩展名的文件,并将它们移动到与扩展名同名的文件夹中。我想对目录中的所有扩展都这样做

有什么想法吗? 谢谢大家!

看看我的代码,但我是用硬编码的变量来做的

$variable=Get-ChildItem -Path "C:\somePath"

foreach ($variables in $variable)
{

   if($extension=($variables | Where {$_.extension -like ".txt"}))
   {

        New-Item -ItemType Directory -Path "C:\somePath\text"
        $extension | Move-Item -Destination "C:\somePath\text"
   }
}

我相信这样做可以:

$variable = Get-ChildItem -Path "C:\somePath"
foreach ($v in $variable){
$dest = '{0}\{1}' -f  $v.DirectoryName, ($v.Extension -replace '^\.')
$v  | Move-Item -Destination $dest -Force
}

尽管此解决方案的外观不如其他解决方案干净,但它确实可以处理目标文件夹不存在的情况。它还移动可能包含特殊字符的文件,如
[]
。它还显式忽略没有扩展名的文件,因为没有对这些文件给出任何要求。通过使用
组对象
,循环量最小化

$Path = "C:\Somepath"
$files = Get-ChildItem -Path $Path -File |
    Group-Object -Property {($_.extension |
        Select-String -Pattern "[^. ]+").matches.value
    }
Foreach ($ExtGroup in $files) {
    $Destination = "$Path\$($ExtGroup.Name)"
    if (!(Test-Path -Path $Destination -PathType Container)) {
        $null = New-Item -Path $Destination -Type Directory
    }
    Move-Item -LiteralPath $ExtGroup.Group -Destination $Destination -Force
}

我想我还没有完全理解。您正在尝试为路径使用变量吗?也许您正在寻找
System.Windows.Forms.FolderBrowserDialog
?您不希望硬编码的部分是什么?是否将其作为命令?具有扩展名的部件。例如,如果在主文件夹中有更多具有相同扩展名或不同扩展名的文件,我希望将它们放在每个扩展名的特定文件夹中。我认为这样做不起作用。如果我有两个或多个文件具有相同的扩展名,这段代码将把这些文件转换成一个文件,我不希望只有当这些文件具有相同的名称时才这样做。扩展名仅用于子文件夹的名称。如果您的文件具有相同的基名,则可以考虑使用DATESAMP重命名它们。-force开关负责处理文件夹不存在的情况(例如,第一个txt文件等)。我尝试了这个,它工作了90%,它创建了文件夹,但没有将项目移动到特定的文件夹中。谢谢你的努力!LaterEdit:我将最后一行更改为$ExtGroup.Group | Move Item-Destination$Destination-Force,它工作得非常好。