Question

J'essaie de vérifier une série de répertoires et de sous-répertoires pour voir s'il existe deux fichiers ou plus portant le même nom dans le même dossier.Je pense que mon problème est de savoir comment j'essaie de valider une chaîne.

Pour le répertoire de test suivant :

  • |-- C: est\
    • |--C: est\AA\
      • |--C: est\YY\xx.log
      • |--C: est\YY\xx.txt
    • |-- C: est\ZZ\
    • |-- C: est\ZZ.log
    • |-- C: est\ZZ.txt

J'ai besoin de mon code pour trouver xx.log et ZZ.log.Je peux inclure une vérification contre $_.PSisContainer (mais je ne pensais pas que c'était nécessaire).

ForEach ($item in (gci "C:\Test\*" -recurse)) {
    If ($item.extension -notmatch "txt" -AND $item.basename+".txt" -eq $True) {
        Write-Host $item.fullname
        } 
    }

$item.basename+".txt" fournit la bonne chaîne mais je ne peux pas utiliser cette chaîne pour valider l'existence du fichier.

Quelqu'un peut-il m'aider à corriger mon code ?J'aimerais apprendre à gérer des chaînes concaténées comme celle-ci - c'est une astuce qui, je pense, serait utile dans d'autres domaines.

Était-ce utile?

La solution

Ceci n'est pas destiné à être une réponse, mais plutôt un commentaire, mais SO ne me permet pas d'ajouter des commentaires pour le moment :(

R_C_III - Je suppose qu'il y a deux erreurs dans le code original.

Premièrement, il ne construit pas le chemin complet du fichier (c'est-à-direNom du répertoire + Nom de la base + .TXT).Plutôt que de concaténer des chaînes pour ce faire, Keith a utilisé la capacité de PowerShell à effectuer des substitutions de valeurs à l'intérieur de chaînes entre guillemets.par exemple.

$s = "there"
write-host "hello $s"

résulte en

hello there

Pour insérer des propriétés d'objet dans une chaîne de cette manière, il est nécessaire d'utiliser des sous-expressions comme l'explique Keith.

$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"

résulte en

c:\somefile.NEW

Deuxièmement (selon mon commentaire sur la réponse de Keith), le code original ne vérifie pas l'existence de la version '.txt' du fichier.La deuxième clause de l'instruction IF tente d'assimiler le nom de fichier modifié à $True ($item.basename+".txt" -eq $True).Cette clause sera toujours évaluée comme fausse.

La modification de Keith ajoute le CmdLet 'Test-Path' qui, dans ce cas, vérifie l'existence du fichier '.txt'.

Autres conseils

Essaye ça:

gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}

Vous n'avez pas besoin de l'initiale Foreach instruction sous forme de commandes PowerShell permettant aux données de sortie d'être utilisées directement au début d'un pipeline.Ensuite, vous filtrez les objets du pipeline avec le Where commande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top