Powershell:替换.txt中的值

时间:2015-12-24 17:28:52

标签: powershell

Powershell(以及一般编程)非常新,所以请耐心等待。我最近创建了一个脚本,允许用户修改备份文件中的系统名称,然后使用新设置创建新的.txt。我遇到的问题是该脚本仅适用于遵循我们的命名约定的系统 - 新系统或错误命名的系统会导致脚本失败,因为它搜索的是尚不存在的名称。这就是我到目前为止所做的:

$name = Read-Host 'What is the system name?'
$currentdate = Get-Date -Format "MM_DD_YY_HH_MM_SS"
if ($name -notlike "Sample*")
    {
        Read-Host 'Please begin naming conventions with "Sample".'
        }
        else {
        (Get-Content C:\Test_Backup.txt)|
Foreach-Object {$_-replace 'Sample[a-z , 0-9]*' , $name}|
Out-file C:\Test_Success.txt} 

因此,例如,当您打开新/错误系统的备份文件并查找系统名称时,它将显示为NAME:“Wrongname123”。该脚本在文件中找不到“Sample *”,因此没有任何反应。我想要做的是通过将引号中出现的任何名称替换为正确的用户输入名称来更改脚本以使用新的/错误命名的系统。我甚至不确定这是可能的,到目前为止我还没能通过Google搜索找到答案,我想这是因为我很难解释我想要它做什么。我真的很感激我能得到的任何帮助。

编辑:

我正在做的是在.txt中创建系统设置的备份。打开备份文件时,它看起来像这样:

NAME:“System1” 体积:“30” INPUT:“RGB” 等...

我所做的是创建一个“主”备份文件,以便用户可以快速将文件上传到新系统,而无需手动输入所有正确的设置。唯一的问题是用户在将其上传到新系统时必须更改名称(每个系统都有一个唯一的名称)。我的备份文件示例非常简单 - 文件中有大量信息,因此不容易进入并手动更改。当我运行脚本时,它会提示用户输入他们正在配置的系统的名称。因此,如果系统当前被命名为“Sample6”并且用户想要将其更改为“Sample7”,则没有问题。但是,如果系统名为“Wrongname1”,则脚本将无法工作,因为它正在寻找“Sample”命名约定。所以我想弄清楚的是我如何让脚本查找NAME:“[这里有任何值]”然后更改引号中包含的任何值。希望这更有意义!

1 个答案:

答案 0 :(得分:2)

如果我理解您的问题,您希望用用户输入替换引号之间的内容。如果是这种情况,只需将正则表达式替换为this answer中的正则表达式,如下所示:

Foreach-Object {$_-replace '(["''])(?:(?=(\\?))\2.)*?\1' , $name}|

注意双撇号,因为PowerShell使用撇号作为常量字符串。如果这是你想要的,一旦你有足够的声誉,请确保你支持海报的答案。

如果Test_Backup.txt包含冒号分隔的属性列表,如下所示:

NAME: "WrongName123"
LAST_BACKUP:  "12_24_15_12_00_00"
FAVORITE_COLOR:  "Blue"

然后您的脚本将替换引号中的所有值。如果您只想替换标记为NAME的那个,则需要在管道中插入Where-Object调用。我使用的是-like,但您也可以使用-match

(Get-Content C:\Test_Backup.txt) |
Where-Object { $_ -like 'NAME:*' } |
Foreach-Object {$_ -replace '(["''])(?:(?=(\\?))\2.)*?\1', $name} |
Out-File C:\Test_Success.txt

快乐的节目!