Téléchargement de fichiers de site web en powershell
Que j'essaie de faire un script pour interroger des fichiers sur un site web IIS, puis télécharger les fichiers automatiquement. Jusqu'à présent, j'ai ceci:
$webclient = New-Object System.Net.webclient
$source = "http://testsite:8005/"
$destination = "C:\users\administrator\desktop\testfolder\"
#The following line returns the links in the webpage
$testcode1 = $webclient.downloadstring($source) -split "<a\s+" | %{ [void]($_ -match "^href=['"]([^'">\s]*)"); $matches[1] }
foreach ($line in $test2) {
$webclient.downloadfile($source + $line, $destination + $line)
}
Je ne suis pas bon à PowerShell encore, et j'ai quelques erreurs, mais j'ai réussi à obtenir un couple de fichiers de test je l'ai jeté dans mon dossier wwwroot (le web.fichier de config semble undownloadable, donc j'imagine que c'est un de mes erreurs). Quand j'ai essayé de changer mon $source
valeur dans un sous-dossier sur mon site qui a quelques test des fichiers texte(exemple = http://testsite:8005/subfolder/
, j'ai des erreurs et pas de téléchargements. L'exécution de mon $testcode1
va me donner les liens suivants dans mon sous-dossier:
/subfolder/test2/txt
/
/subfolder/test1.txt
/subfolder/test2.txt
Je ne sais pas pourquoi il répertorie les test2 fichier deux fois. J'ai pensé que mon problème était que, comme il était de retour le sous-dossier/format de fichier, que j'ai été faire des erreurs parce que j'étais en train de télécharger $source + $line
, qui serait essentiellement http://testsite:8005/subfolder/subfolder/test1.txt
, mais quand j'ai essayé d'y remédier en ajoutant dans un $root
valeur qui a été le répertoire racine de mon site et de faire un foreach($line in $testcode1) { $webclient.downloadfile($root + $line, $destination + $line) }
, je reçois toujours des erreurs.
Si certains d'entre vous à haute vitesse gourous peuvent aider à me montrer l'erreur de mes moyens, je lui en serais reconnaissant. Je suis à la recherche de télécharger tous les fichiers dans chaque sous-dossier sur mon site, dont je sais qu'impliquerait l'utilisation de certains récursive de l'action, mais encore une fois, j'ai actuellement n'ont pas le niveau de compétence de moi-même de le faire. Je vous remercie à l'avance de m'aider!
Pensez à utiliser wget pour cette tâche.
Détails supplémentaires: je suis à l'aide de PowerShell 2.0, et ne peuvent pas passer à la v3 ou d'utiliser toutes les applets de commande n'est native PowerShell, ni de l'installer rien de plus sur mon ordinateur, donc je suis en train d'essayer de trouver une solution, je peux effectuer avec un standard de Windows 7 machine.
Avez-vous essayé de cet autre type de méthode? stackoverflow.com/questions/11436694/...
Oui, cette méthode a été utilisée comme la base de ce que je suis en train de faire ici, mais quand j'ai tapé ça, il ne serait pas télécharger quoi que ce soit. Je uderstand ce qu'il est en train de faire, mais sa méthode de fractionnement le code source de saisir les liens semble inefficace, mais sans l'aide de sa méthode, il est difficile pour moi de récupérer certains de la durée de code pour mieux mes propres (manque de connaissance de ma part, actuellement).
OriginalL'auteur Sacto_Smithers | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Meilleure façon de télécharger des fichiers à partir d'un site web est d'utiliser
Invoke-WebRequest –Uri $url
Une fois que vous êtes en mesure d'obtenir le html, vous pouvez analyser le contenu pour les liens.
$result = (((Invoke-WebRequest –Uri $url).Links | Where-Object {$_.href -like “http*”} ) | select href).href
Lui donner un essai. Son plus simple que $service = New-Object System.Net.webclient
OriginalL'auteur A_N
Je voudrais essayer ceci:
Je pense que votre seul problème ici est que vous avez été en saisissant un nouveau fichier dans un nouveau répertoire, et de le mettre dans un dossier qui n'existe pas encore (je peux me tromper).
Vous pouvez faire un peu de dépannage supplémentaires si cela ne résout pas votre problème:
Copie de chaque ligne individuellement dans votre fenêtre powershell et de les exécuter jusqu'à la boucle foreach. Puis tapez votre variable contenant tout l'or:
Lorsque vous entrez dans la console, il doit cracher exactement ce qui est là. Ensuite, vous pouvez faire de dépannage supplémentaires comme ceci:
Et voir si cela ressemble la façon dont il devrait tous le chemin vers le bas. Vous pourriez avoir à ajuster mon code un peu.
-Dale Harris
$destination + $line
partie a ma question était correcte. Après la création du sous-dossier dans mon dossier de test, les fichiers téléchargés, mais je reçois toujours le message d'erreur suivant:Exception calling "DownloadFile" with "2" argument(s): "An exception occurred during a webClient request"
At line:12 char:25
+ $webclient.downloadfile <<<< ($root + $line, $destination + $line)
` + CategoryInfo :NotSpecified (:) [], MethodInvokationExeption` ` + FullyQualifiedErrorId : DotNetMethodExeption`Je l'ai trouver cette erreur est parce que l'une des lignes retournées comme un lien vers le répertoire parent, énumérés dans mes résultats retournés comme un \. Comment pourrais-je aller sur l'obtention d'une déclaration d'ignorer ces?
OriginalL'auteur DaleHarris541
C'est pour augmenter A_N de réponse avec deux exemples.
Télécharger ce Stackoverflow question de
C:/temp/question.htm
.Télécharger un document texte simple à
C:/temp/rfc2616.txt
.OriginalL'auteur Shaun Luttin
J'ai fait un simple script powershell pour cloner un openbsd package de prise en pension.... sans doute serait-travail /pourraient être mises en œuvre dans d'autres moyens/cas d'utilisation pour des choses similaires..
https://github.com/forgottentq/powershell/blob/master/Package_Repo_Cloner
OriginalL'auteur WylieBSD