powershell中的replace命令正在删除整个内容

时间:2017-07-26 14:31:27

标签: powershell

我是PowerShell的新手。我创建了一个powershell脚本,需要在参数中提供的路径中搜索字符串并替换该字符串。但实际上它正在用新字符串替换整个文件内容。

我在Windows 10操作系统中使用Powershell。 代码:

param(
        [Parameter(Mandatory=$true, ParameterSetName="Path", Position=0,HelpMessage='Data folder Path')]
        [string] $Path,


        [Parameter(Mandatory=$true, HelpMessage='Input the string to be replaced')]
        [string] $Input,

        [Parameter(Mandatory=$true,HelpMessage='Input the new string that need to be replaced')]
        [string] $Replace

)

$a = Test-Path $Path
IF ($a -eq $True) {Write-Host "Path Exists"} ELSE {Write-Host "Path Doesnot exits"}
$configFiles = Get-ChildItem -Path $Path -include *.pro, *.rux -recurse
$Append = join-path -path $path \*
$b = test-path $Append -include *.pro, *.rux
If($b -eq $True) {
  foreach ($file in $configFiles)
  {
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace [regex]::Escape($Input), $Replace } |
    Set-Content $file.PSPath
  } 
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Operation Completed",0,"Done",0x0)
}

2 个答案:

答案 0 :(得分:1)

尽管如此,我可以在不直接复制的情况下阅读本文,但这是错误的地方:

(get-content $ file.pspath)获取文件的全部内容,而不是其名称。

你的" foreach"然后在文件中的每一行中进行正则表达式,最后" set-content"替换文件的内容,而不是其路径。

如果要更改文件名,则需要查找Rename-Item,而不是Set-Content。如果你想要一个文件$ file.Name的名称,你就不需要Get-Content,这将......获取它的内容:)

答案 1 :(得分:1)

这应该是一个有效的解决方案。

Param(
  [Parameter(Mandatory,
             ParameterSetName='Path',
             Position=0,
             HelpMessage='Data folder Path')]
  [String]
  $Path,
  [Parameter(Mandatory,
             HelpMessage='Input the string to be replaced')]
  [String]
  $StringToReplace,
  [Parameter(Mandatory,
             HelpMessage='Input the new string that need to be replaced')]
  [String]
  $ReplacementString
)
If (!(Test-Path $Path)) {
  Write-Host 'Path does not exist'
  Return
}

Get-ChildItem -Path $Path -Include *.pro,*.rux -Recurse |
  ? { $_.Name -like "*$StringToReplace*" } |
  % { Rename-Item $_ $($ReplacementString+$_.Extension) }

(New-Object -ComObject Wscript.Shell).Popup("Operation Completed",0,"Done",0x0)