如何在PowerShell中使用此命令?

时间:2013-11-21 19:35:03

标签: windows powershell replace

我需要针对一个包含大约3000个文档的库运行以下命令,但是已经阻止了获得正常工作的正则表达式(不是我最强的套装),或者相当于PowerShell中的/v选项。有人可以指出我正确的方向吗?

我的命令

C:\findstr /v "<?xml version=" filename.htm > ..\testOut\filename.htm

我到目前为止使用PowerShell

(Get-Content ($srcfiles)) | Foreach-Object {$_.srcfiles -replace '<?xml version="1.0" encoding="utf-8"?>', ("")} | Set-Content  ($srcfiles)

2 个答案:

答案 0 :(得分:0)

Get-Content返回一个行数组,而不是文件的全文作为单个字符串。

如果您正在尝试从每个文件中删除xml声明,请尝试此操作,假设$srcfiles是完整文件路径的集合:

foreach($file in $srcfiles)
{
    $content = Get-Content $file | ? { $_ -notmatch "<\?xml[^>]+>" }
    $content | Set-Content $file -Force
}

基本上,循环遍历所有文件,获取每个文件的内容,忽略任何xml声明行,然后将该数据推回原始文件。我分两步执行此操作,因为PowerShell不允许您将内容写入您获取数据的同一管道中的文件。

答案 1 :(得分:0)

$path = "C:\Path\To\Documents"
$outputPath = "C:\Path\To\OutputDocuments"

Get-ChildItem $path | % { 
   $content = ( Get-Content -Raw $_ ) -replace '<?xml version="1.0" encoding="utf-8"?>', '' 
   $fileName = Join-Path $outputPath $_.Name
   Set-Content -Path $fileName -Value $content
}

如果您使用的是PowerShell 2.0或更低版本,请将“Get-Content -Raw”替换为“Get-Content -ReadCount 0”。

您还需要将Get-ChildItem的输出过滤为仅返回文件而不是目录。在PowerShell 3.0或更高版本中,您可以将“-File”参数添加到Get-ChildItem。否则,试试这个:

Get-ChildItem $path | ? { $_.GetType() -eq "FileInfo" } | % {