Powershell在文本行上迭代会引发异常

Powershell在文本行上迭代会引发异常,powershell,Powershell,我正在尝试将大量的.txt文件解析为我需要的特定格式 该准则的目标是: 删除顶部的39行文字 拆下底部的6条线 删除每行开头的前53个字符 在每行前面加上文件名 这是我的代码: $targetDir = "E:\home\export\" $indexDir = "E:\index\" Get-ChildItem -Path "$indexDir\*" -Include *.txt -Recurse | % { $file = $_ $name = $file | Sele

我正在尝试将大量的.txt文件解析为我需要的特定格式

该准则的目标是:

  • 删除顶部的39行文字
  • 拆下底部的6条线
  • 删除每行开头的前53个字符
  • 在每行前面加上文件名
这是我的代码:

$targetDir = "E:\home\export\"
$indexDir = "E:\index\"

Get-ChildItem -Path "$indexDir\*" -Include *.txt -Recurse | % {
    $file = $_
    $name = $file | Select -exp BaseName

    get-content $file | select -Skip 39 | select -SkipLast 6 | ForEach-Object {
        $_ = $name + "\" + $_.Remove(53, $_.Length)
    }| set-content $file+"temp"
    move $file+"temp" $file -Force
}
Remove函数正在引发以下异常:

Exception calling "Remove" with "2" argument(s): "Index and count must refer to a location within the string. Parameter name: count"
At E:\create_index_stap2.ps1:9 char:9
+         $_ = $name + "\" + $_.Remove(53, $_.Length)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException
文本文件如下所示:

**********************
Windows PowerShell transcript start
Start time: 20200324111411
Username: MYPC\xorinzor
RunAs User: MYPC\xorinzor
Configuration Name: 
Machine: MYPC (Microsoft Windows NT 10.0.17763.0)
Host Application: C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe
Process ID: 18468
PSVersion: 5.1.17763.1007
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.17763.1007
BuildVersion: 10.0.17763.1007
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Transcript started, output file is E:\index\filename.7z.txt

7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive for archives:
1 file, 29931544 bytes (29 MiB)

Listing archive: E:\home\export\filename.7z

--
Path = E:\home\export\filename.7z
Type = 7z
Physical Size = 29931544
Headers Size = 2281
Method = LZMA2:24
Solid = +
Blocks = 1

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2018-03-17 11:14:44 D....            0            0  Contacts
2018-03-17 13:38:06 D....            0            0  Desktop
2018-03-17 13:22:04 D....            0            0  Documents
2018-02-06 14:14:28 D....            0            0  Documents\Some directory
------------------- ----- ------------ ------------  ------------------------
2018-12-16 07:36:34           43367240     29929263  79 files, 37 folders
**********************
Windows PowerShell transcript end
End time: 20200324111411
**********************
基本上,如果本例中的文本文件名为“filename.7z.txt”,我希望以以下文件内容结束:

filename.7z\Contacts
filename.7z\Desktop
filename.7z\Documents
filename.7z\Documents\Some directory

为什么我的代码会抛出异常?

这似乎是您想要的。[咧嘴笑]

但是,由于这是一份成绩单,因此重新运行代码以获得所需的用户文件夹可能更容易。。。也许可以将导出添加到CSV或CliXml,以便以后可以根据需要重新导入数据

这段代码似乎注释得很好。如果你有问题,请问。。。[咧嘴笑]

输出

A_FileName.7z\Contacts
A_FileName.7z\Desktop
A_FileName.7z\Documents
A_FileName.7z\Documents\Some directory

这似乎是你想要的。[咧嘴笑]

但是,由于这是一份成绩单,因此重新运行代码以获得所需的用户文件夹可能更容易。。。也许可以将导出添加到CSV或CliXml,以便以后可以根据需要重新导入数据

这段代码似乎注释得很好。如果你有问题,请问。。。[咧嘴笑]

输出

A_FileName.7z\Contacts
A_FileName.7z\Desktop
A_FileName.7z\Documents
A_FileName.7z\Documents\Some directory

String.Remove()
的第二个参数参数(
count
)是结果子字符串的长度,而不是原始子字符串的长度(因此是错误),它也将从索引53中删除,而不是最多。您需要的是
String.Substring()
$line.Remove(53,$line.Length)
->
$line.Substring(53)
@MathiasR.Jessen是有意义的,但是使用
$\uu.Substring(53)
表示startindex不能大于字符串长度。我认为行没有正确地进行迭代,但不确定为什么不进行迭代。
$\uz.Substring([Math]::Min($\uz.Length,53))
then:)@MathiasR.Jessen现在我收到错误
move:找不到路径“E:\index\filename.7z.txt+temp”,因为它不存在。stringlength应该总是大于53,因此我认为foreach对象代码不正确,但我无法发现问题。将
$file+“temp”
的所有实例更改为
“${file}temp”
第二个参数参数(
count
)更改为
String.Remove()
是结果子字符串的长度,而不是原始子字符串的长度(因此是错误),它也将从索引53中删除,而不是最多。您需要的是
String.Substring()
$line.Remove(53,$line.Length)
->
$line.Substring(53)
@MathiasR.Jessen是有意义的,但是使用
$\uu.Substring(53)
表示startindex不能大于字符串长度。我认为行没有正确地进行迭代,但不确定为什么不进行迭代。
$\uz.Substring([Math]::Min($\uz.Length,53))
then:)@MathiasR.Jessen现在我收到错误
move:找不到路径“E:\index\filename.7z.txt+temp”,因为它不存在。stringlength应该总是大于53,所以这让我相信foreach对象代码是不正确的,但我无法发现问题。将
$file+“temp”
的所有实例更改为
“${file}temp”
是否可以将脚本修改为而不是使用拆分,它会删除每行的前53个字符?文件大小并不总是0,这很不幸会破坏脚本。而前缀信息的长度始终为53个字符。@xorinzor-yes!我应该考虑一下。[脸红]我会在大约5分钟内测试并更新代码。@xorinzor-非常欢迎您!很高兴能帮上一点忙。。。[grin]是否可以修改脚本以删除每行的前53个字符,而不是使用拆分?文件大小并不总是0,这很不幸会破坏脚本。而前缀信息的长度始终为53个字符。@xorinzor-yes!我应该考虑一下。[脸红]我会在大约5分钟内测试并更新代码。@xorinzor-非常欢迎您!很高兴能帮上一点忙。。。[咧嘴笑]