Question Lire un fichier txt

Plus d'informations
il y a 11 ans 1 semaine #19217 par Fabrice
Lire un fichier txt a été créé par Fabrice
Bonjour,
Je débute dans Powershell et je me fais déjà des nœuds dans mon cervelets :)
Je me cherche des scripts a créer pour m'entrainer, et j'ai un soucis sur un problème surement basique pour vous.

J'ai un fichier listenoms.txt, avec 3 prénoms (Thomas, Romain, Estelle).
Je voudrai pour chacun de ses prénoms, crée un fichier txt (thomas.txt, Romain.txt, Estelle.txt)

Voici mon script newfile.ps1:

param(
[parameter(Mandatory=$true)]
$listenoms
)

function creerfile ($nom) {
Write-Host $nom
New-Item -path . -name thomas.txt -itemtype \"file\"
#New-Item -path . -name thomas.txt -itemtype \"file\"
}


foreach ($ligne in Get-Content($listenoms)) {
creerfile($ligne)
}

J'exécute donc .\newfile.ps1 listenoms.txt

Voici le message d'erreur

PS C:\Users\Fabrice\Desktop\Powershell> .\newfile.ps1 listenoms.txt
Thomas
New-Item : L'accès au chemin d'accès 'C:\Users\Fabrice\Desktop\Powershell' est refusé.
Au caractère C:\Users\Fabrice\Desktop\Powershell\newfile.ps1:8 : 1
+ New-Item -path . -name $nom.txt -itemtype \"file\"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\Fabrice\Desktop\Powershell:String) [New-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

Romain
New-Item : L'accès au chemin d'accès 'C:\Users\Fabrice\Desktop\Powershell' est refusé.
Au caractère C:\Users\Fabrice\Desktop\Powershell\newfile.ps1:8 : 1
+ New-Item -path . -name $nom.txt -itemtype \"file\"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\Fabrice\Desktop\Powershell:String) [New-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand

C'est pareil pour Estelle

Il récupère bien mes ligne que j'arrive a afficher, mais ne veux pas me créer un fichier avec cet argument.
Alors que si je rentre directement thomas.txt (ma ligne en commentaire), évidement cela fonctionne.

Merci de votre aide.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 semaine #19218 par Fabien
Réponse de Fabien sur le sujet Re:Lire un fichier txt
J'ai l'impression que tu te complique la vie, bon je suis un débutant comme toi, mais pour quoi t'utilise pas ton \"get-content\" pour analyser ton fichier texte et après pour chaque nom trouvés dans ton fichier texte il créée un fichier texte au même nom.
Ce qui donnerai cela:

[code:1]
$ListeNoms = get-content 'Chemin\listenoms.txt'
foreach ($Nom in $ListeNoms){
New-Item \"Chemin de Destination\$Nom.txt\" -ItemType File
}
[/code:1]<br><br>Message édité par: Bylliboy, à: 10/03/15 00:23

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 semaine #19220 par Fabrice
Réponse de Fabrice sur le sujet Re:Lire un fichier txt
Bonjour Bylliboy et merci de ta réponse,
Effectivement je me complique la vie :) , mais c'est plus pour apprendre à manipuler les paramètres, fonctions et boucles dans un premier temps. M'entrainer a passer des arguments...
Ta solution m'a permis de débloquer la mienne, il me manquait des \&quot; \&quot; ici :
New-Item -path . -name \&quot;$nom.txt\&quot; -itemtype \&quot;file\&quot; ceci fonctionne
alors que New-Item -path . -name $nom.txt -itemtype \&quot;file\&quot; me renvoi les erreurs.

Si je pouvais comprendre la différence, cela m'aiderai grandement. Merci de votre aide.


PS : Désole mais dans mon message d'origine, j'avais mis thomas.txt à la place de $nom.txt

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 semaine #19222 par Philippe
Réponse de Philippe sur le sujet Re:Lire un fichier txt
salut FireBirds

c'est un problème de chaine de caractères et d'objet.
le parseur de powershell essai de traduire $nom.txt et le point lui dis que qu'il manipule un objet !

test ceci :

[code:1]$nom = \&quot;thomas\&quot;
Write-Host '$nom donne : ' $nom
Write-Host '$nom.txt donne : '$nom.txt
Write-Host '\&quot;$nom.txt\&quot; donne : ' \&quot;$nom.txt\&quot;

# resultat :

# $nom donne : thomas
# $nom.txt donne :
# \&quot;$nom.txt\&quot; donne : thomas.txt
[/code:1]

Laurent a fait quelques totu ici regarde celui sur la structure des données

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 semaine #19223 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Lire un fichier txt
6ratgus écrit:

Laurent a fait quelques tuto ici regarde celui sur la structure des données

Je n'ai pas abordé la liaison de paramètre, mais voici qq explications détaillées :


Attention les fonctions Powershell n'utilisent pas les parenthèses pour passer un ou des paramètres :
[code:1]
#creerfile($ligne)
creerfile $ligne
[/code:1]

Le pourquoi du message d'erreur.
Quant à savoir pourquoi une variable dont le contenu est à $null est autorisée pour le paramètre Name il faut creuser un 'peu' :
[code:1]
//code C# du cmdlet New-Item
[AllowEmptyString, AllowNull, Parameter(ParameterSetName = \&quot;nameSet\&quot;, Mandatory = true, ValueFromPipelineByPropertyName = true)]
public string Name
[/code:1]
C'est que l'attribut Allownull l'autorise :-)

De plus, par défaut le parseur de Powershell (la mécanique interne) se comporte, sur certains point, de manière relâchée :
[code:1]
function Test {
param ($un,$deux,$trois)
write-host \&quot;Un=$un\&quot;
}
Test test.txt
#Un=test.txt
[/code:1]
Dans l'exemple suivant pas de pb, on reçoit bien une valeur.
Mais pas pour celui-ci :
[code:1]
Test $Test.txt
#Un=
[/code:1]
Car la valeur reçue est à $null.

La variable $Test n'existe pas, PS transforme l'argument et passe $null au paramètre nommé 'un'.
Comme $null ne peut pas avoir de propriété, le 'relâchement' entre en scène car PS ne tient pas compte de ce cas d'erreur (incohérence).
Ici on demande à PS 'Donne moi qq chose à partir de rien'.
'D'accord' répond-t-il et il renvoi rien ;-)

Donc pour continuer sur ta lancée :
FireBirds écrit:

Bonjour,
Je débute dans Powershell et je me fais déjà des nœuds dans mon cervelets

Je te pose la question : Est-ce que rien c'est quelque chose ?
:-)

Si on demande une analyse stricte :
[code:1]
Set-StrictMode -Version latest
Test $test.txt

#Création de la variable
$Test='Exist'
Test $test.txt
[/code:1]
Dans les deux cas, l'erreur est prise en compte, l'incohérence (dans ce contexte) de la demande est gérée.
Ici on demande à PS 'Donne moi qq chose à partir de rien'.
'Je ne sais pas faire' répond-t-il !
Moins de nœuds à faire.

Si on construit un objet, et pas une chaîne de caractères :
[code:1]
$Test=New-Object PSobject -Property @{'txt'='ToDelete'}
Test $test.txt
#Un=ToDelete
[/code:1]
Le parseur remplace bien le contenu de la propriété nommée 'txt' de l'objet $Test, le parcourt de transformation d'argument devient plus compréhensible, en tout cas moins opaque.
Dans le cas précédent :
[code:1]
$Test='Exist'
[/code:1]
Le type String ne possède pas de propriété nommée 'txt'.

Dans ce mode, l'appel dans ton code génère une erreur :
[code:1]
New-Item -path . -name $nom.txt -itemtype \&quot;file\&quot;
Set-StrictMode -Off # on revient au mode par défaut
[/code:1]
Enfin, l'ajout de guillemets force la substitution AVANT la transformation, ce qui fait que l'argument est bien renseigné avec une chaîne de caractères.
Le parseur ne recherche plus une propriété sur un objet qui n'existe pas ou qui ne possède pas la propriété demandé.

Tu commences bien :-)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 1 semaine #19231 par Philippe
Réponse de Philippe sur le sujet Re:Lire un fichier txt
Bonjour Laurent

Je voulais donné une petite explication mais j'espérais un peu que tu la donne ! :blush:
et tu la fait 100 fois mieux que moi B)

Je te pose la question : Est-ce que rien c'est quelque chose ?

c'est le sujet du prochain BAC de philo ??? :whistle:

Tu commences bien :)

eeeuuh

Enfin, l'ajout de guillemets force la substitution AVANT la transformation, ce qui fait que l'argument est bien renseigné avec une chaîne de caractères.
Le parseur ne recherche plus une propriété sur un objet qui n'existe pas ou qui ne possède pas la propriété demandé.

bon ça c'était la reponse que j'allais donné si FireBirds voulais plus d'info !
un peu court à coté de toi !!!

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.053 secondes
Propulsé par Kunena