我是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!}
}
答案 0 :(得分:2)
如果你愿意学习,为什么不从这里开始。
您可以使用PS中的Get-Content命令获取文件的一些信息。 http://blogs.technet.com/b/heyscriptingguy/archive/2013/07/06/powertip-counting-characters-with-powershell.aspx和Getting 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
来过滤那些我们想要的长度的结果。
然后,对于每个文件,我们尝试将其移动到与匹配文件位于同一位置的子目录。如果没有子文件夹,我们就可以了。
警告:
Where-Object
切换至少需要3.0。取而代之的是,您可以更新-File
以获得另一个子句:Where-Object
答案 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=0
和if (-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 | %{}
,其中迭代项由$_
表示。