Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:替换.txt中的值_Powershell - Fatal编程技术网

Powershell:替换.txt中的值

Powershell:替换.txt中的值,powershell,Powershell,Powershell(以及一般的编程)非常新,所以请耐心听我说。我最近创建了一个脚本,允许用户在备份文件中修改系统名称,然后使用新设置创建一个新的.txt文件。我遇到的问题是,脚本只适用于遵循命名约定的系统——新系统或命名错误的系统会导致脚本失败,因为它搜索的名称还不存在。这就是我到目前为止所做的: $name = Read-Host 'What is the system name?' $currentdate = Get-Date -Format "MM_DD_YY_HH_MM_SS" if

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} 
因此,例如,当您打开一个新的/不正确的系统的备份文件并查找系统名称时,它显示为名称:“错误名称123”。脚本在文件中找不到“Sample*”,因此不会发生任何事情。我想做的是,通过将引号中出现的任何名称替换为正确的用户输入名称,将脚本更改为使用新的/命名错误的系统。我甚至不确定这是否可行,我至今还无法通过谷歌搜索找到答案,我想这是因为我很难解释我想要它做什么。我真的很感激能得到的任何帮助

编辑:

我正在做的是在.txt中创建系统设置的备份。打开备份文件时,它的外观如下所示:

NAME: "WrongName123"
LAST_BACKUP:  "12_24_15_12_00_00"
FAVORITE_COLOR:  "Blue"
名称:“系统1” 卷:“30” 输入:“RGB” 等等


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

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

Foreach-Object {$_-replace '(["''])(?:(?=(\\?))\2.)*?\1' , $name}|
请注意双撇号,因为PowerShell对常量字符串使用撇号。如果这就是你想要的,一旦你有了足够的声誉,确保你对海报的答案投赞成票

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

NAME: "WrongName123"
LAST_BACKUP:  "12_24_15_12_00_00"
FAVORITE_COLOR:  "Blue"
然后脚本将替换引号中的所有值。如果只想替换一个标记的名称,则需要在管道中插入一个
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

快乐编程

作为初学者,我尽量远离正则表达式,尤其是在这种形式下。从我收集的信息来看,您可能在流/锚定方面存在问题。第二,看起来“Sample”是一个需要的模式,但你要替换它吗?:)你能举一两个好的和坏的例子吗?嗨,Jaqueline,谢谢你的回复。我更新了我原来的帖子——我希望它现在更有意义!好吧,你为什么不直接读一下系统名,如果它“坏”了,要么修改它,要么记录它?另外,您可能会考虑使用不同的“文本”文件格式——JSON或PSD1似乎适合于这样的任务,也适用于XML,但它会有点过头,而且与AH一起工作有点困难,我想我得到了您的问题,最后:D,在TXT中,您有“S1,S2,S3”。“如果系统是B4,你没有什么可比的,它还是三个系统中的一个,对吗?是的!对不起,解释得不好!詹姆斯明白我想做什么,幸运的是:)这正是我想做的!谢谢你,詹姆斯!我忘记了like子句中的星号。确保将其标记为已接受的答案。享受