文件根据从文件名派生的子字符串移动

时间:2011-09-06 08:12:20

标签: file powershell filenames

我已经启动了一个简单的脚本,以便将特定前缀的文件移动到同名文件夹,例如:W100_11.jpg W100_12.jpg到文件夹W100。

感谢下面的答案的帮助,我已经取得了进展,并有一个成功的循环,可以遍历文件夹文件,我遇到-filter开关的问题,并尝试使用move-item cmdlet我得到错误

目前的代码是:

$sourceDir = read-host "Please enter source Dir:"
$format = read-host "Format to look for with .  :"
#$length = read-host "length of folder name:"

gci -Path $sourceDir | % {
    If( -not $_.PSIsContainer)
    {
        $path = $sourceDir + "\" + $_.Name.substring(0, 3)
        $_
        if(-not (Test-Path $path))
        {
            mkdir $path

        }
        move $_.fullname $path

    }  
}

使用-filter开关时,我仍然遇到问题。这是问题的部分解决方案

3 个答案:

答案 0 :(得分:2)

下面的代码缩短了for循环,并显示了在文件名上使用子字符串的示例。您从Get-ChildItem(gci)调用中获取FileInfo对象,因此您需要使用它的属性Name来执行子字符串。有关FileInfo的更多信息,请参阅MSDN

$sourceDir = read-host Please enter source Dir
$format = read-host Format to look for with .  

gci -Path $sourceDir -filter $format | % {
    If( -not $_.PSIsContainer)
    {
        $path = $sourceDir + "\" + $_.Name.substring(0, 3)  
        if(-not (Test-Path $path))
        {
            mkdir $path
        }
        move $_ $path
    }  
}

答案 1 :(得分:1)

如果文件名始终带有此前缀“W100”,您可以通过这种方式轻松获取子字符串:

$a = "w100_12.ps1"
$a.Substring(0,4) # give W100

如果前缀不是修复,请提供更多样本以帮助您解决问题。

答案 2 :(得分:1)

当管道使用内置变量$ _来引用管道对象时,'%'符号是'for each'的别名:

get-childitem -Path $sourceDir -Filter $format -Recurse | % {If ($_.extension -eq ".ps1"){Write-Host $_.fullname}}

上面的答案引用子字符串,这是解释Powershell子字符串用法的MS Technet页面:

http://technet.microsoft.com/en-us/library/ee692804.aspx