2010-04-30 12 views
3

Lors de l'examen de certains problèmes, j'ai trouvé que la raison était une conversion différente inattendue en chaîne [] de données d'entrée apparemment identiques. A savoir, dans le code ci-dessous, deux commandes renvoient les deux mêmes éléments File1.txt et File2.txt. Mais la conversion en chaîne [] donne des résultats différents, voir les commentaires.Mystérieuse conversion différente en chaîne [] de données d'entrée apparemment identiques

Des idées pourquoi est-ce? Cela pourrait être un bug. Si quelqu'un le pense aussi, je le soumettrai. Mais il serait bon de comprendre ce qui se passe et d'éviter les pièges comme ça.

# *** WARNING 
# *** Make sure you do not have anything in C:\TEMP\Test 
# *** The code creates C:\TEMP\Test with File1.txt, File2.txt 

# Make C:\TEMP\Test and two test files 
$null = mkdir C:\TEMP\Test -Force 
1 | Set-Content C:\TEMP\Test\File1.txt 
1 | Set-Content C:\TEMP\Test\File2.txt 

# This gets just file names 
[string[]](Get-ChildItem C:\TEMP\Test) 

# This gets full file paths 
[string[]](Get-ChildItem C:\TEMP\Test -Include *) 

# Output: 
# File1.txt 
# File2.txt 
# C:\TEMP\Test\File1.txt 
# C:\TEMP\Test\File2.txt 
+0

On dirait un bug. – stej

+0

Oui, je dirais que c'est un bug que PowerShell construit des objets FileInfo de différentes manières en fonction des paramètres, voir ma propre réponse à la question pour plus de détails. –

Répondre

8

Eh bien, j'ai quelques indices (probablement poster la question a stimulé mes pensées). Oui, c'est un piège, pas seulement dans PowerShell (mais PowerShell le permet).

Apparemment PowerShell utilise simplement ToString() pour la conversion. Et c'était une mauvaise hypothèse que System.IO.FileInfo.ToString() renvoie le FullName. Le réflecteur montre qu'il renvoie le base.OriginalPath qui est juste ce qui a été passé dans le constructeur, pas nécessairement un chemin complet.

Voici la démo:

Set-Location C:\TEMP\Test 
[string](New-Object IO.FileInfo File1.txt) 
[string](New-Object IO.FileInfo C:\TEMP\Test\File1.txt) 
[string](New-Object IO.FileInfo ./..//Test///..Test\File1.txt) 

# Output: 
# File1.txt 
# C:\TEMP\Test\File1.txt 
# ./..//Test///..Test\File1.txt 

Ainsi, il semble que le premier Get-ChildItem utilise seulement des noms sur la création d'objets et FileInfo la deuxième Get-ChildItem avec le paramètre –Include utilise les chemins complets. Est-ce un bug? Cela semble discutable maintenant. Ce pourrait être une caractéristique, discutable, mais toujours avec quelques raisons sous-jacentes. Je doute, cependant ...

+0

Bonne enquête :) Je le soumettrais comme un bogue, car imho 'Get-ChildItem' devrait renvoyer les mêmes objets ne dépendant pas de la façon dont vous l'avez appelé ... – stej

+1

Soumis comme bogue 556004: https: // connect .microsoft.com/PowerShell/commentaires/détails/556004/get-childitem-gets-fileinfo-construit-dans-différentes-manières-en fonction des paramètres –