如何解决用文件名替换特定行号的文本
我有400多个.vcf文件,我想用文件名替换“ FN:”行(第4行)。我已经看过多种解决方案,即使我知道有办法可以实现我想要的东西,我也似乎找不到。
这是我目前所拥有的
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_Functions
和about_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 举报,一经查实,本站将立刻删除。