如何在Powershell中替换远程计算机上文件中的字符串?

时间:2018-11-19 22:48:20

标签: powershell

我有一个运行Windows Server 2012的VM,上面有一些预期的服务。我想从台式机远程更改此VM计算机上的配置文件。 目前,我通过映射远程服务器的C:驱动器来更改此配置文件,然后更改该文件。现在,这使我无法更改多个服务器,因为我无法将多个服务器c:同时映射到同一驱动器。而且,映射数百个驱动器也不是理想的选择。 我通过映射驱动器更改文件的方式是:

$password = <password text> | ConvertTo-SecureString -asPlainText -Force
$username = "admin"
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
net use Z: \\$ipAddress\C$ <password> /user:admin type 'z:\Program Files\lalaland\Data\Settings.xml'

(Get-Content 'z:\Program Files\lalaland\Data\Settings.xml') | ForEach-Object { $_ -replace $oldString, $newString } | Set-Content 'z:\Program Files\lalaland\Data\Settings.xml'
type 'z:\Program Files\lalaland\Data\Settings.xml'
net use z: /delete

因此,我搜索了一个更好的选项,并在https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Replace-String-58fbfa85处找到了该脚本,但它对我不起作用。

我将此脚本用作:

.\Replace-StringInFile.ps1 -ComputerName  <RemoteComputerHostName> -TargetPath 'C:\Program Files\lalaland\Data' -Fil

eName Settings.xml-替换$ oldString -ReplaceWith $ newString-凭据(获取凭据)

当我运行命令凭据窗口时,弹出窗口询问用户名和密码。输入用于映射驱动器的用户名和密码,但是会引发以下错误:

New-PSSession : [<RemoteHostName>] Connecting to remote server <RemoteHostName> failed with the following error message : The user name or password is incorrect. For more information, see the
about_Remote_Troubleshooting Help topic.
At D:\workspace\Replace-StringInFile.ps1:84 char:14
+ ...  $Session = New-PSSession -ComputerName $Computer -Credential $Creden ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : LogonFailure,PSSessionOpenFailed

我不明白的是,当我使用相同的凭据映射驱动器时,它可以正常工作,但使用内部使用New-PSSession的其他脚本不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我可以使用以下cmdlet进行此操作:

function Edit-RemoteFileStringReplace
{
  [cmdletbinding()]
  param([Parameter(Mandatory=$true)][ValidateScript({$_ -match [IPAddress]$_ })][string]$Address,
        [Parameter(Mandatory=$true)][string]$FilePath,
        [Parameter(Mandatory=$true)][string]$Replace,
        [Parameter(Mandatory=$true)][string]$ReplaceWith,
        [Parameter(Mandatory=$true)][System.Management.Automation.PSCredential]$Credential
  )

  $DriveLetter=""
  $FilePathWithoutDriveLetter=""

  $DriveName = $Address.replace('.','x')
  $DriveName = "PSDrive_$DriveName"

  $DriveLetter = (Get-DriveLetterFromPath -Path $FilePath).Substring(0,1)
  $FilePathWithoutDriveLetter = Remove-DriveLetterFromPath -Path $FilePath
  $MappedFilePath="$DriveName" + ":$FilePathWithoutDriveLetter"

  New-PSDrive -Name $DriveName -PSProvider FileSystem -Root \\$Address\$DriveLetter$ -Credential $Credential -ErrorAction Stop
  (Get-Content $MappedFilePath) | ForEach-Object { $_ -replace $Replace, $ReplaceWith } | Set-Content $MappedFilePath
  Remove-PSDrive -Name $DriveName
}