2017-05-25 3 views
0

ich eine einfache myscript.ps1 haben URLs von Dateien, von this tutorial genommen zu extrahieren:Powershell Zugriff auf Dateien mit select-string - Zugriff verweigert wird

$input_path = 'd:\myfolder\*' 
$output_file = 'd:\extracted_URL_addresses.txt' 
$regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?' 
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file 

Ich betreibe Powershell als Administrator an und geben Sie dann:

D:/myscript.ps1 

Aber für die meisten der Wege innerhalb d:\myfolder ich:

select-string : The file D:\myfolder\templates cannot be read: Access to the path 'D:\myfolder\templates' is denied. 

Der Ordner wird vom FTP-Server mit WinSCP kopiert. Ich habe versucht, zu den Ordnereigenschaften zu gehen und das Kästchen "Nur lesen" anzukreuzen, um sie anzuwenden, aber jedes Mal, wenn ich die Eigenschaften erneut eingabe, ist es wieder "schreibgeschützt" (ich bin mir nicht sicher, ob das mit dem Problem zu tun hat).

Ich arbeite auf Windows 10.

+2

Sieht aus wie 'D anhängen: \ myfolder \ templates' ein Ordner ist keine Datei Select-String kann mit arbeiten. – LotPings

+0

Können Sie Dateien in D: \ myfolder \ templates durchsuchen, und wenn Sie Dateien sehen, können Sie sie öffnen? Das klingt nach einem ACL-Problem für mich. – TheMadTechnician

+0

@TheMadTechnician Ja, ich bin in der Lage, diese Ordner ohne Probleme zu öffnen und zu durchsuchen. – PolGraphic

Antwort

0

von @LotPings auf dem Kommentar erweitern Sie in D:\myfolder unter Verwendung -File Parameter nur die Dateien von Get-ChildItem bekommen konnte. Auf diese Weise geben Sie kein Verzeichnis an Select-String weiter.

$input_path = 'd:\myfolder' 
$Files = Get-ChildItem $input_path -File | Select-Object -ExpandProperty FullName 
Foreach ($File in $Files) { 
    $output_file = 'd:\extracted_URL_addresses.txt' 
    $regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?' 
    select-string -Path $file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file 
} 
0
  • Als $input ist ein automatic variable Ich würde es nicht verwenden - nicht einmal als Teil eines Variablennamen.
  • Sie brauchen ForEach-Object Verwendung nicht zwei gestapelte $_.Matches.Values statt
  • eine Dateierweiterung im Pfad schließlich den Fehler vermeiden könnte Mit
  • das folllowing Skript verwenden auf einer Kopie dieser Webseite funktioniert einwandfrei, aber eine Menge von Duplikaten haben , so würde ich ein |Sort-Object -Unique

$FilePath = '.\*.html' 
$OutputFile = '.\extracted_URL_addresses.txt' 
$regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?' 
Get-ChildItem -File $FilePath | 
    Select-String -Pattern $regex -AllMatches | 
    ForEach-Object { $_.Matches.Value } |Sort -Unique > $OutputFile 
Verwandte Themen