Hoe kan ik een lange code invoegen?

Status
Niet open voor verdere reacties.

Visara

Gebruiker
Lid geworden
10 mrt 2019
Berichten
217
Goedemiddag,

Hoort mijn vraag in dit forumgedeelte thuis?

Ik heb een werkende code voor WindowsPowerShell.
De code maakt een file en voegt deze file vervolgens als bijlage toe aan een email en verzend deze.
Dit werkt.
Ik heb deze code met geanonimiseerde gegevens toegevoegd als bijlage in dit bericht.

Ik wil dat deze code elke dag automatisch om bijv 23:00 wordt uitgevoerd.
Daar komt Windows Taakplanner om de hoek kijken. Je kan een code in de Parameter invoegen zolang je het tussen aanhalingstekens zet (zie afbeelding hieronder), maar hoe plaats ik er meerdere coderegels in?
Of kan ik het beter anders aanpakken?
TaskManager_PowerShell_Parameter.jpg
Mijn kennis van PowerShell en Taakplanner is erg klein.

Met vriendelijke groet,
Visara
 

Bijlagen

  • PowerShellCode.txt
    1 KB · Weergaven: 26
Vertel je computer eerst dat deze Powershell scripts mag uitvoeren.
Start Powershell als Administrator en geef daarin de volgende opdracht:
Code:
set-executionpolicy remotesigned
Beantwoord dan de vraag met Y en sluit Powershell.

Hernoem je bestand bestand PowerShellCode.txt naar PowerShellCode.ps1
De opdrachtregel in de Task Scheduler wordt nu: Powershell
De parameter wordt dan: -file "C:\JeFolder\PowerShellCode.ps1"

Daarnaast kan je naar mijn idee voor dat soort dingen beter VBScript gebruiken dan Powershell.
 
Laatst bewerkt:
Hartelijk dank voor uw reactie.
Uw tip over het gebruik van VBScript knoop ik in mijn achterhoofd. Omdat ik het snel werkend wil krijgen hou ik het even bij wat ik nu probeer, want ik ben er denk ik bijna.

Ik heb:
-PowerShell als Administrator uitgevoerd en heb 'Y' ingevoerd.
-PowerShellcode als tekstbestand geopend en opgeslagen als .ps1-bestand.
-Taak in Taakplanner gemaakt en vulde
Code:
-file "C:\MijnFolderNaam\PowerShellCode.ps1"
in als Parameter (juiste foldernaam, juiste filenaam)

Toen het tijd was voor de geplande taak zag ik de powershell-browser even heel kort opflitsen, maar de code leek niet te worden uitgevoerd.
In de Taakplanner staat als 'Resultaat van vorige keer uitvoeren': (0x1)

Zou ik de ps1-file "handmatig" uit moeten kunnen voeren? Rechtermuis en kies: 'Run with PowerShell', zie afbeelding
RunPowerShell.jpg
Want dat lukt dus niet. De PowerShell-browser flitst even op, maar er gebeurd verder niks.

Gaat er misschien iets mis met het opslaan van de .ps1-file? Ik liet de defauld-optie UTF-8 aan staan. Moet dat anders?
PowerShellCode_OpslaanAls.jpg
 
Je verteld niet wat je als opdrachtregel in de Taakplanner hebt ingevuld.
Ik zei POWERSHELL maar je kan ook de opdracht proberen die je eerder gebruikte.
De parameter is goed. Zet anders eens dit onderin je .ps1 bestand:
Code:
Write-Host -NoNewLine 'Press any key to continue...';
Dan kan je in ieder geval zien of er foutmeldingen verschijnen.
 
Laatst bewerkt:
Ik weet niet zeker wat de 'opdrachtregel' is waar u naar verwijst.
Is dat dit:
TaakplannerActiePowerShell.jpg
Dit staat in het veld voor Programma/Script:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

OnderIN de Powershell-code heb ik " Write-Host -NoNewLine 'Press any key to continue...'; " gezet. Is dat wat je bedoelde?
Als ik die code in z'n geheel in PowerShell plak en op [enter] druk staat de tekst 'Press any key to continue' onderin. Ik heb niet het idee dat ik actief een toets in moet drukken om verder te gaan ofzo. De code wordt uitgevoerd.
PS_Screenshot.jpg
Als ik deze code opsla als .ps1 en via de taakplanner uit laat voeren óf als ik de ps1-file handmatig uitvoer (rechtermuisknop) dan zie ik Powershell wel opflitsen, maar er is geen resultaat :(
 
Dit gaat 'm zo niet worden verwacht ik.
Als je kan vertellen wat dit stukje precies doet wil ik het hele verhaal wel voor je in VBS maken:
Code:
$fileContent = foreach ($file in (get-childitem *$today*3*.csv)) {
    $pcnum = ($file.name)[-9]
    Get-content $file |
    select-object -skip 1 |
    ForEach-Object{
        $_ + ";$pcnum"
    }
}
$filecontent |
out-file "C:\Test\FileContent_$today.txt" -force
 
Laatst bewerkt:
Wat aardig :)

In een map staan héél veel .csv-files. Elke dag komen er files bij. (deze files zijn kassabonnen)
Ik wil deze kassabonnen in 1 tabel hebben staan zodat ik met MS Access diverse rapporten kan maken.
Ik wil elke dag de kassabonnen van de afgelopen dag in 1 .txt-file zetten en deze file naar mezelf mailen zodat ik het vervolgens met een paar klikjes kan importeren in mijn MS Access database.
De datum is te zien in de naam van de .csv-file, en gelukkig hebben deze files altijd dezelfde opmaak. De datum staat dus altijd op dezelfde positie, zo kan een computercode 'weten' welke files hij moet nemen (ik wil de files van 'Vandaag')
Voorbeeld van de naam van een file: (heb ook een file toegevoegd als bijlage)
6202012191042_002030012.csv
#YYYMMDD####_####X####.csv
De # zijn altijd cijfers, altijd zoveel als hier weergegeven.
De X is altijd cijfer 1, 2 of 3. (Kassa1, Kassa2 of Kassa3)

De code "zoekt" in een specifieke map. Het "bekijkt" alle namen van de aanwezige .csv-files. Het zoekt naar YYYYMMDD="Vandaag" op de locatie in de csv-filenaam. Ik wil de code om bijv 23:00 laten draaien. Dan is de winkel allang dicht en dan haal ik dus alle kassabonnen binnen.
De code slaat altijd de eerste regel van de csv-files over (dit zijn de kolomnamen). De rest van de inhouden worden allemaal in 1 txt-file gezet. De data van de verschillende kolommen worden gescheiden door een ;
Het $pcnum is de X, dit is het Kassanummer. Deze bevindt zich niet in de csv-data, maar ik wil het wel aan elke regel toevoegen. Elke regel uit de txt-file wordt een record in de database.

Vervolgens slaat de code deze text-file op onder de naam FileContent_YYYYMMDD.txt
Een regel uit deze text-file ziet er bijv zo uit:
4653;9;2172960000000;'Franse Baguette';1;2,75;1;6;1;0;1;0;0;0;12-12-2020 11:53:03;3;0;1;0;3
De laatste ;3 is de X, in dit geval met Kassa3.
 

Bijlagen

  • 6202012191042_002030012.csv
    1,1 KB · Weergaven: 20
Bij deze de Visual Basic Script (VBS) code.
Sla het op als bijvoorbeeld Kassabonnen2Access.vbs

Zelf aanpassen:
Het pad naar de kassabonnen.

In het mail gedeelte aanpassen:
- Je gebruikersnaam
- Je wachtwoord
- Het adres van de afzender
- Het adres van de ontvanger

Het werkt hier perfect.
Als het mailen niet lukt ligt het aan de instellingen.
Zelf heb ik het getest met de smtp.gmail.com

Tip:
Gebruik Notepad++ voor het editen van .vbs bestanden:
https://notepad-plus-plus.org/downloads/v7.0/

Taakplanner gebruik:
https://www.ct.nl/workshops/windows-taakplanner-gebruiken-taken/

Code:
[COLOR="#008000"]'-------------------------------------------------------------------------------------------------
'Datum : 28-04-2021
'Auteur: Edmoor (Helpmij)
'Voor  : Visara (Helpmij)
'URL   : https://www.helpmij.nl/forum/showthread.php/959713-Hoe-kan-ik-een-lange-code-invoegen
'-------------------------------------------------------------------------------------------------[/COLOR]

Datum = Year(Now()) & PadDigits(Month(Now()), 2) & PadDigits(Day(Now()), 2)
Kassabonnen = "F:\Helpmij\Visara\Kassabonnen"

Set objFSO = Createobject("Scripting.FileSystemObject")
Set oFolder = objFSO.GetFolder(Kassabonnen)

Bestand = "C:\Test\FileContent_" & Datum & ".txt"
Set csvUIT = objFSO.CreateTextFile(Bestand, True)

For Each oFile in oFolder.Files
    If Mid(oFile.Name, 2, 8) = Datum Then
        LeesCSV (Kassabonnen & "\" & oFile.Name)
    End If
Next 

csvUIT.Close
MailFile
WScript.Quit

[COLOR="#008000"]'---------------------------------------------[/COLOR]
Sub LeesCSV(CSV)
    Kassanr = Mid(oFile.Name, 19, 1)
    Set csvIN = objFSO.OpenTextFile(CSV, 1, False)
	
    Regel = csvIN.Readline
    Do Until csvIN.AtEndOfStream
        Regel = csvIN.Readline
	csvUIT.WriteLine(Regel) & ";" & Kassanr
    Loop

    csvIN.Close
End Sub
[COLOR="#008000"]
'----------------------------------------------[/COLOR]
Function PadDigits(val, digits)
     PadDigits = Right(String(digits,"0") & val, digits)
End Function

[COLOR="#008000"]'----------------------------------------------[/COLOR]
Sub MailFile()
    Dim objMessage, objConfig, Fields, Schema
    Set objMessage = CreateObject("CDO.Message")
    Set objConfig = CreateObject("CDO.Configuration")
    Set Fields = objConfig.Fields
    Schema = "http://schemas.microsoft.com/cdo/configuration/"

    With Fields
      .Item(Schema & "sendusing") = 2
      .Item(Schema & "smtpserver") = "smtp.outlook.com"
      .Item(Schema & "smtpserverport") = 587
      .Item(Schema & "smtpauthenticate") = 1
      .Item(Schema & "sendusername") = "Je Gebruikersnaam"
      .Item(Schema & "sendpassword") = "Je Wachtwoord"
      .Item(Schema & "sendtls") = True
      .Item(Schema & "smtpusessl") = True
      .Update
    End With

    Set objMessage.Configuration = objConfig
    With objMessage
      .Subject = "Test bericht"
      .From = "Je Email adres"
      .To = "De Ontvanger"
      .HTMLBody = "File met kassabonnen van vandaag"
      .AddAttachment Bestand
    End With
    objMessage.Send
End Sub

In de Task Scheduler Actions ziet het er dan zo uit, uiteraard afhankelijk van waar je dat script hebt geplaatst:
TSK.jpg
 
Laatst bewerkt:
Bedankt voor uw code!
Ik heb het niet helemaal aan de praat gekregen.
Eerst stoeide ik nog met het pad naar de .vbs-file. Deze file stond in een map met een spatie in de naam. Dit pad werd in de taakplanner met "aanhalingstekens" opgeslagen. De Taakplanner herkende bij de uitvoer het pad niet als een .vbs-code en vroeg me met welk programma ik het wilde openen wanneer de Taakplanner werd uitgevoerd :) Goede les, geen spaties in mapnamen. Ik bedachte me wat er mis was doordat ik in uw screenshot géén aanhalingstekens zag staan.

Als ik de .vbs-file na rechtermuisklik laat "Openen met Opdrachtprompt" wordt de txt-file op een correcte manier gemaakt, maar is er geen spoor te vinden van een email.
Als ik de .vbs-file uit laat voeren via de Taakplanner wordt de txt-file gemaakt, en komt er deze pop-up:
TaakplannerVBS_foutcode.jpg
De foutmelding geeft aan dat de regel objMessage.Send issues oplevert.

Over uw tip over Notepad++ : Ik ben een prille cursist voor JavaScript. Ik gebruik daar Visual Studio Code bij. Lijkt ook te werken bij .vbs. Handig, die verschillende kleuren. Zie je soms ook snel of je een typefout maakt.
 
Om het te testen kan je gewoon dubbelklikken op het .vbs bestand.
Er is niks mis met de mail code en ligt het zoals ik al zei aan instellingen.
Welke smtp server gebruik je?
 
smtp.outlook.com
Poort 587
En ik voer mijn eigen hotmailadres in. Het kan me trouwens niks schelen waar het vanuit wordt verstuurd, het maakt me alleen uit waar het naartóe wordt gestuurd.

Die instellingen waar je het over hebt, zijn dat denk je instellingen van anti-virus programma's? Windows zelf? Emailprogramma?
Deze onderdelen van de PowerShell code werken zolang ik de code handmatig uitvoer. Staan hier instellingen die gekopieerd kunnen worden naar uw code?
Code:
$message = new-object System.Net.Mail.MailMessage 
$message.From = $fromaddress 
$message.To.Add($toaddress)
$message.IsBodyHtml = $True 
$message.Subject = $Subject 
$attach = new-object Net.Mail.Attachment($attachment) 
$message.Attachments.Add($attach) 
$message.body = $body 
$smtp = new-object Net.Mail.SmtpClient($smtpserver, 587)
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential(“[COLOR="#0000FF"]xxxxxxxxxxxxxxxxxxxxx)[/COLOR];
$smtp.Send($message)
 
Laatst bewerkt door een moderator:
Nee, ik heb het over de SMTP instellingen.
Ik zal er morgen (vandaag dus ;)) naar kijken voor outlook.com
 
Dank!
Ja, het is al laat he :) Gevoelsmatig vind ik de grens naar de volgende dag liggen bij het punt dat je '4' in de tijd noemt. Tien voor half vier voelt als vroeg in de ochtend van de nieuwe dag, kwart over 3 voelt als laat in de nacht van de bijna afgelopen dag.
Dus u heeft geluk, ik keur het goed als u het over "morgen" heeft ;)

Die "smpt" en de bijbehorende "587" heb ik gegoogled en in de oorspronkelijke code geplakt. Voor zover ik begrijp is het niet genoeg om in de code te noemen vanaf welk emailadres je het verstuurd, maar moet moet die poort en smpt-naam er bij. Ik heb geen idee hoe ik aan instellingen kan rommelen van zoiets.
 
Haal in #11 je credentials even weg.
 
De credentials heb ik maar even aangepast.
 
Haal in #11 je credentials even weg.
Ik las het voordat ik naar mijn werk ging, ik dacht dat u het over het weghalen van de credentials in mijn code had (zodat de code wél zou werken)
Ik dacht: dat ga ik vanavond even rustig nakijken.
Maar ik had mijn inloggegevens gepost... domme ik :s
Heb mijn wachtwoord inmiddels veranderd.
En dank aan de moderator!
 
Ik maak het morgen voor GMAIL voor je in orde.
 
CDO client voor GMAIL

Bij deze.
Vul je gebruikersnaam van GMAIL in en je wachtwoord.
Vul tevens het email adres van de ontvanger in.
De verzender (From) moet een email adres bevatten maar wordt niet gebruikt.

Zorg er tevens voor dat je bij de instellingen in GMAIL hebt aangegeven dat minder veilige apps zijn toegestaan:
https://support.google.com/accounts/answer/6010255?hl=nl


Code:
Sub MailFile()
    Dim objMessage, objConfig, Fields, Schema
    Set objMessage = CreateObject("CDO.Message")
    Set objConfig = CreateObject("CDO.Configuration")
    Set Fields = objConfig.Fields
    Schema = "http://schemas.microsoft.com/cdo/configuration/"
	
    With Fields
      .Item(Schema & "sendusing") = 2
      .Item(Schema & "smtpserver") = "smtp.gmail.com"
      .Item(Schema & "smtpserverport") = 465
      .Item(Schema & "smtpauthenticate") = True
      .Item(Schema & "sendusername") = "<gebruikersnaam>@gmail.com"
      .Item(Schema & "sendpassword") = "<Het wachtwoord>"
      .Item(Schema & "smtpusessl") = True
      .Update
    End With
	
    Set objMessage.Configuration = objConfig
    With objMessage
      .Subject = "Test bericht"
      .From = "dummynaam@domein.nl"
      .To = "<ontvanger@domein.nl>"
      .HTMLBody = "File met kassabonnen van vandaag"
      .AddAttachment Bestand
    End With
    objMessage.Send
End Sub

Het maken van het CSV bestand was al in orde toch?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan