Question
Lire un fichier txt
- Fabrice
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
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.
- Fabien
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
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.
- Fabrice
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 3
- Remerciements reçus 0
Effectivement je me complique la vie
Ta solution m'a permis de débloquer la mienne, il me manquait des \" \" ici :
New-Item -path . -name \"$nom.txt\" -itemtype \"file\" ceci fonctionne
alors que New-Item -path . -name $nom.txt -itemtype \"file\" 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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
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 = \"thomas\"
Write-Host '$nom donne : ' $nom
Write-Host '$nom.txt donne : '$nom.txt
Write-Host '\"$nom.txt\" donne : ' \"$nom.txt\"
# resultat :
# $nom donne : thomas
# $nom.txt donne :
# \"$nom.txt\" 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je n'ai pas abordé la liaison de paramètre, mais voici qq explications détaillées :Laurent a fait quelques tuto ici regarde celui sur la structure des donné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 = \"nameSet\", 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 \"Un=$un\"
}
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:
Je te pose la question : Est-ce que rien c'est quelque chose ?Bonjour,
Je débute dans Powershell et je me fais déjà des nœuds dans mon cervelets
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 \"file\"
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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
Je voulais donné une petite explication mais j'espérais un peu que tu la donne !
et tu la fait 100 fois mieux que moi
c'est le sujet du prochain BAC de philo ???Je te pose la question : Est-ce que rien c'est quelque chose ?
eeeuuhTu commences bien
bon ça c'était la reponse que j'allais donné si FireBirds voulais plus d'info !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é.
un peu court à coté de toi !!!
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Lire un fichier txt