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

时间:2015-06-23 18:17:58

标签: powershell

我在这个网站周围看了一下,似乎找不到适合我情况的东西。基本上,我正在尝试编写一个.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:>”提示,只是“>>>”并且文件未按预期更改。

1 个答案:

答案 0 :(得分:16)

如果这就是你如何准确地获得代码那么我认为这是因为你有一个开头的单引号而没有结束。您仍然会遇到其他两个问题,并且您的代码中有一个答案。 >>>是行继续符,因为解析器知道代码不完整,并为您提供继续代码的选项。如果您故意在多行上编码一行,您会认为这是一个功能。

$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. (.*) - 之后的一切
  3. 然后我们使用format运算符将新用户名夹在这些捕获组之间。