用文件名替换特定行号的文本

如何解决用文件名替换特定行号的文本

我有400多个.vcf文件,我想用文件名替换“ FN:”行(第4行)。我已经看过多种解决方案,即使我知道有办法可以实现我想要的东西,我也似乎找不到。

这是我目前所拥有的

文件名:LastNamefirstName

BEGIN:VCARD
VERSION:3.0
N:lastName;firstName;;;
FN:firstName lastName
ADR:;;111 Main Rd;Columbia;MO;65202;
TEL;TYPE=mobile:(111) 222-3333
EMAIL;TYPE=work:email@gmail.com
BDAY:20000101
END:VCARD

这是我想要实现的目标

保留“ FN:”并将其后的文本替换为文件名文本。

BEGIN:VCARD
VERSION:3.0
N:lastName;firstName;;;
FN:LastNamefirstName
ADR:;;111 Main Rd;Columbia;MO;65202;
TEL;TYPE=mobile:(111) 222-3333
EMAIL;TYPE=work:email@gmail.com
BDAY:20000101
END:VCARD

这个Powershell脚本可以完成我想要的一半,但是我真的很想把文件名输入到replaceLineText中。

# Set by user to their needs.
$filestocheck = "C:\path\*.vcf"
$linetochange = 4
$replacementLineText = "New Text"

# Gather list of files based on the path (and mask) provided by user.
$files = gci $filestocheck

# Iterate over each file.
foreach ($file in $files) {

    # Load the contents of the current file.
    $contents = Get-Content $file

    # Iterate over each line in the current file.
    for ($i = 0; $i -le ($contents.Length - 1); $i++) {

        # Are we on the line that the user wants to replace?
        if ($i -eq ($linetochange - 1)) {

            # Replace the line with the Replacement Line Text.
            $contents[$i] = $replacementLineText

            # Save changed content back to file.
            Set-Content $file $contents
        }
    }
}

任何输入或指导将不胜感激!

解决方法

我真的很想把文件名输入到replaceLineText中。

要接受所有目标文件的路径,只需声明一个参数

param(
  [Parameter(Mandatory = $true)]
  [string[]]$Path
)

$lineToChange = 4

# Gather list of files based on the path (and mask) provided by user.
$files = gci -Path $Path

# ... rest of original script

我对变量名做了一些修改-Path是描述可扩展路径的字符串的惯用参数名,通常期望参数名是大写。

Mandatory关联的[Parameter()]属性中的$Path标志意味着调用者必须提供一个值-否则PowerShell会提示输入该值:

PS C:\> .\script.ps1

cmdlet script.ps1 at command pipeline position 1
Supply values for the following parameters:
Path:

PS C:\> .\script.ps1 -Path "C:\path\*.vcf" # now it won't prompt

有关参数的更多信息,请参见about_Functionsabout_Functions_Advanced_Parameters帮助主题-尽管文档是关于 function 的,但参数的规则及其声明对于脚本文件(您可以将脚本文件视为恰好位于文件系统而不是内存中的函数)


gci(或Get-ChildItem)cmdlet返回[FileInfo]对象以及所有文件元数据,因此要将文件名用作循环内的替换值,只需执行{ {1}}:

$file.Name

由于您已经知道要修改哪个索引(行号减1),因此可以跳过内部循环,而是执行以下操作:

$contents[$i] = "FN:$($file.Name)"
# or using the -f format operator:
$contents[$i] = "FN:{0}" -f $file.Name

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?