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

Tim*_*ite 6 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
Run Code Online (Sandbox Code Playgroud)

我没有收到错误,但它也没有回到正常的"PS C:>"提示符,只是">>>"并且文件未按预期更改.

Mat*_*att 17

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

$path = "c:\Users\$($env:username)\desktop\VPN.txt" 
(Get-Content $path) -replace "user1",$env:username | out-file $path 
Run Code Online (Sandbox Code Playgroud)
  • 在引号中关闭路径并使用变量,因为您已经两次调用路径.
  • %name%用于命令提示符.PowerShell中的环境变量使用$env:您在代码段中执行过的提供程序.
  • -replace是一个可以解决的正则表达式替换工具,Get-Content但您需要首先在子表达式中捕获结果.
  • 其次 -replace是正则表达式,你的字符串不是正则表达式,你也可以使用.Replace().
  • Set-ContentOut-File出于性能原因,通常优选.

所有这一切......

你也可以试试这样的东西.

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

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

你可以在这里使用一些小正则表达式来调整你的使用方法 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 
Run Code Online (Sandbox Code Playgroud)

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

  1. (.*?) - 直到第一个"user1"
  2. (.*) - 之后的一切

然后我们使用format运算符将新用户名夹在这些捕获组之间.