计算每行的字符数

时间:2015-10-27 11:33:55

标签: powershell

我是WinPowerShell的新手。拜托,您能不能给我一些代码或信息,如何编写一个程序,该程序将对下一个文件夹中的所有* .txt文件执行操作: 1.为文件中的每一行计算字符数 2.如果行长超过1024个字符,则在该文件夹中创建一个子文件夹并在那里移动文件(我将知道哪个文件每行有超过1024个字符)

我尝试过VB和VBA(这对我来说比较熟悉),但我想学习一些新的东西!

非常感谢!

编辑:我发现代码的某些部分正在开始

$fileDirectory = "E:\files";
foreach($file in Get-ChildItem $fileDirectory)
    {
       # Processing code goes here
    }

OR

$fileDirectory = "E:\files";
foreach($line in Get-ChildItem $fileDirectory)
{
 if($line.length -gt 1023){# mkdir and mv to subfolder!}
}

3 个答案:

答案 0 :(得分:2)

如果你愿意学习,为什么不从这里开始。

您可以使用PS中的Get-Content命令获取文件的一些信息。 http://blogs.technet.com/b/heyscriptingguy/archive/2013/07/06/powertip-counting-characters-with-powershell.aspxGetting character count for each row in text doc

答案 1 :(得分:1)

通过第二次编辑,我确实看到了一些努力,所以我想帮助你。

 $response = Unirest\Request::get("https://vanitysoft-boundaries-io-v1.p.mashape.com/reaperfire/rest/v1/public/boundary?and=false&includepostal=false&limit=30&state=DC&zipcode=20002%2C20037%2C20005",
  array(
    "X-Mashape-Key" => "VKyYkdzXXkmshnMjcFTCh1EZFOadp1xhlbbjsnGVgrqf759VSh",
    "Accept" => "application/json"
  )
);

你可以把它作为一个单行,但它会不必要地复杂化。在$path = "D:\temp" $lengthToNotExceed = 1024 $longFiles = Get-ChildItem -path -File | Where-Object {(Get-Content($_.Fullname) | Measure-Object -Maximum Length | Select-Object -ExpandProperty Maximum) -ge $lengthToNotExceed} $longFiles | ForEach-Object{ $target = "$($_.Directory)\$lengthToNotExceed\" If(!(Test-Path $target)){New-Item $target -ItemType Directory -Force | Out-Null} Move-Item $_.FullName -Destination $target } 返回的数组上使用measure对象。该数组或多或少是一个字符串数组。在PowerShell中,字符串具有Get-Content属性查询。

这将返回文件中的最大长度行。我们使用length来过滤那些我们想要的长度的结果。

然后,对于每个文件,我们尝试将其移动到与匹配文件位于同一位置的子目录。如果没有子文件夹,我们就可以了。

警告:

  1. Where-Object切换至少需要3.0。取而代之的是,您可以更新-File以获得另一个子句:Where-Object
  2. 对于包含大量行的文件,这会表现不佳。

答案 2 :(得分:0)

这是我上面的评论缩进和.ps1脚本形式的行。

$long = @()

foreach ($file in gci *.txt) {
    $f=0
    gc $file | %{
        if ($_.length -ge 1024) {
            if (-not($f)) {
                $f=1
                $long += $file
            }
        }
    }
}

$long | %{
    $dest = @($_.DirectoryName, '\test') -join ''
    [void](ni -type dir $dest -force)
    mv $_ -dest (@($dest, '\', $_.Name) -join '') -force
}

我还提到标签并在那里打破。而不是$f=0if (-not($f)),您可以使用break打破内循环,如下所示:

$long = @()

foreach ($file in gci *.txt) {
    :inner foreach ($line in gc $file) {
        if ($line.length -ge 1024) {
            $long += $file
            break inner
        }
    }
}

$long | %{
    $dest = @($_.DirectoryName, '\test') -join ''
    [void](ni -type dir $dest -force)
    mv $_ -dest (@($dest, '\', $_.Name) -join '') -force
}

您是否碰巧注意到调用foreach的两种不同方式?有详细的foreach命令,然后是command | %{},其中迭代项由$_表示。