使用PowerShell替换文本文件的内容

7
我在这个网站上找了一圈,似乎找不到符合我情况的东西。基本上,我想要编写一个 NETLOGON 文件的附加内容,以替换所有用户桌面上文本文件中的文本。当前文本在各个电脑上都是静态的。
我想要更改的文本将对每个用户都是唯一的。我希望将当前文本(user1)更改为用户的 AD 用户名(例如 johnd, janed 等)。我使用的是 Windows Server 2008 R2,所有工作站都是 Windows 7 Professional SP1 64 位。
以下是我迄今为止尝试过的代码(有几个变量,但都因为某种原因而不起作用):
gc c:\Users\%USERNAME%\desktop\VPN.txt' -replace "user1",$env:username | out-file c:\Users\%USERNAME%\desktop\VPN.txt

我没有收到任何错误信息,但它也没有回到正常的“PS C:>”提示符,只显示了“>>>”,文件也没有按预期更改。

2个回答

21

如果您的代码确实是这样的,那么我想问题可能是因为您有一个没有闭合的单引号。您仍将遇到另外两个问题,并且您的代码中已经有一个答案。 >>> 是行继续字符,因为解析器知道代码不完整并给您继续编写代码的选项。如果您故意在多行上编写单行代码,则可以将其视为功能。

$path = "c:\Users\$($env:username)\desktop\VPN.txt" 
(Get-Content $path) -replace "user1",$env:username | out-file $path 
  • 在引号中关闭路径并使用变量,因为您调用了两次该路径。
  • %name% 在命令提示中使用。PowerShell中的环境变量使用$env:提供程序,您在代码片段中也使用了它。
  • -replace 是一个正则表达式替换工具,可以对Get-Content进行操作,但您需要先在子表达式中捕获结果。
  • 其次,使用-replace是为正则表达式而设计的,而您的字符串不基于正则表达式,因此还可以使用.Replace()
  • 出于性能原因,通常推荐使用Set-Content而不是Out-File

话虽如此...

您也可以尝试类似以下的内容。

$path = "c:\Users\$($env:username)\desktop\VPN.txt"
(Get-Content $path).Replace("user1",$env:username) | Set-Content $path 

您是否只想替换第一次出现的内容?

您可以在获取使用Get-Content的方式上进行微调,然后在此处使用一些正则表达式。

$path = "c:\Users\$($env:username)\desktop\VPN.txt" 
(Get-Content $path | Out-String) -replace "(.*?)user1(.*)",('$1{0}$2' -f $env:username) | out-file $path 

正则表达式将匹配整个文件。它捕获了两个组。

  1. (.*?) - 匹配第一个"user1"之前的所有内容
  2. (.*) - 匹配此后的所有内容

然后我们使用格式化运算符在这些捕获的组之间插入新用户名。


第一个很好用,谢谢!另外一件事,我没注意到下一行还有另一个包含用户1的字段,但我不想改变它。有没有办法只替换那一行并将另一个字段更改为其他内容?(例如:将user1更改为$env:username,将passuser1更改为pass1234) - Timothy White
@TimothyWhite 已经做了一个小更新,如果有帮助的话。至于更改密码,这将取决于它在文件中的位置,并且很可能是另一个问题。如果您事先知道密码,您可以链式使用-replace "user", "user2" -replace "werwq", "asdf" 命令。当我知道您正在以明文方式存储密码文件时,我不得不发出义务的批评。 - Matt
非常好的回答,Matt。感谢您花时间对其进行全面的解释,这真的很有帮助。 - ibebbs
救命稻草... 仅一行代码 - Urvashi Gupta

2

使用:

(Get-Content $fileName) | % {
    if ($_.ReadCount -eq 1) {
        $_ -replace "$original", "$content"
    }
    else {
        $_
    }
} | Set-Content $fileName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接