我有一个我需要搜索的超过500个字符串的列表。 (他们的网址,如果重要的话。)我的网站有超过1,000个网页。我想搜索每个网页,找到每个链接到的网址。
当我们的网站在Unix机器上时,我会用find和grep写一个小的shell脚本来完成这个,但是现在我们在Windows机器上,所以'不是一个真正的选择。我根本没有使用PowerShell的经验,但我怀疑这是我需要的。但是,我不知道如何开始。
理想情况下,我想最终得到的是这样的:
<filename 1>
<1st string found>
<2nd string found>
<3rd string found>
<filename 2>
<1st string found>
<2nd string found>
我不需要知道行号;我只需要知道哪些URL在哪些文件中。 (我们将把所有500多个目标网址移动到新的位置,因此我们必须手动更新1,000多个网页中的链接。这将是一个巨大的痛苦。)
大概逻辑是这样的:
for each file {
print the filename
for each string {
if string found in file {
print the string
}
}
}
我们无法直接进行查找/替换,因为网页位于内容管理系统中。我们所能做的就是找到需要更新的页面(使用本地驱动器上的网页的静态副本),然后手动更新CMS中的各个页面。
我希望这很容易做到,但我对PowerShell的完全不熟悉意味着我不知道从哪里开始。任何帮助将不胜感激!
感谢Travis Plunk的帮助!根据他的回答,这是我将要使用的代码的最终版本。
# Strings to search for
$strings = @(
'http://www.ourwebsite.com/directory/somefile.pdf'
'http://www.ourwebsite.com/otherdirectory/anotherfile.pdf'
'http://www.otherwebsite.com/directory/otherfile.pdf'
)
# Directory containing web site files
cd \OurWebDirectory
$results = @(foreach($string in $strings)
{
Write-Host "Searching files for $string"
# Excluding the images directory
dir . -Recurse -Exclude \imagedir | Select-String -SimpleMatch $string
}) | Sort-Object -Property path
$results | Group-Object -Property path | %{
"File: $($_.Name)"
$_.Group | %{"`t$($_.pattern)"}
}
答案 0 :(得分:2)
这非常接近你想要的。
# Strings to search for
$strings = @(
'string1'
'string2'
)
$results = @(foreach($string in $strings)
{
# Be sure to update path to search and file search pattern
dir .\testdir\*.* -Recurse | Select-String -SimpleMatch $string
}
) | Sort-Object -Property path
$results | Select-Object 'path', 'pattern', 'LineNumber'
示例输出
Path Pattern LineNumber
---- ------- ----------
C:\Users\travi\testdir\test1.txt string1 1
C:\Users\travi\testdir\test1.txt string2 2
C:\Users\travi\testdir\test2.txt string1 2
C:\Users\travi\testdir\test2.txt string2 1
您可以将line
添加到`select-object&#39;声明打印整行。
要使输出更像您要求此代码打印结果的内容:
$results | Group-Object -Property path | %{
"File: $($_.Name)"
$_.Group | %{"`t$($_.linenumber):$($_.line)"}
}
会给出这样的输出:
File: C:\Users\travi\testdir\test1.txt
1:string1
2:string2
File: C:\Users\travi\testdir\test2.txt
2:string1
1:string2