Batch-Datei mit einigen Bedingungen?

Hey Leute,

im Vorhinein: Nein es handelt sich nicht um eine Hausarbeit oder Ähnliches... Ich brauche einfach Hilfe, da ich diese Aufgabe zur Übung mache.

Dies ist die Aufgabenstellung:

  1. Schreibe ein Skript, das in einem vorgegeben Pfad, die Dateien nach einem bestimmten String durchsucht. Der Pfad der gefunden Dateien soll Zeilenweise in eine Textdatei geschrieben werden.
  2. Erweitere das Skript so, dass wenn der String nicht gefunden wird, eine Meldung ausgegeben wird und das Skript beendet wird.
  3. Wenn der String gefunden wurde soll die Anzahl der betroffenen Dateien Ausgegeben werden.
  4. Erweitere das Skript um die Möglichkeit, die Dateipfade der gefunden Dateien anzeigen zu lassen.
  5. Nun soll nach dem String gefragt werden, mit dem der gesuchte String ersetzt werden soll.
  6. Nach dem der String eingegeben wurde, soll gefragt werden ob der String in allen Dateien auf einmal oder in jeder Datei einzeln ersetzt werden soll. (Ersetzen kommt in Teil 6 + 7)
  7. Das Skript soll den String in allen Dateien ohne Nachfrage ersetzen. Zusätzlich soll die Anzahl der geänderten Dateien ausgegeben werden.
  8. Das Skript soll für jede Datei einzeln nachfragen, ob der String in ihr ersetzt werden darf. Es soll zusätzlich eine Meldung ausgeben werden, ob der String in der Datei ersetzt wurde oder nicht.
  9. Zum Schluss soll der Teil des Skriptes das für das Ersetzen zuständig ist, erst nach Bestätigung des Users ausgeführt werden. Will der User nicht ersetzen wird das Skript beendet und eine Meldung ausgegeben.

Soweit bin ich aktuell:

@echo off
cd /d D:\Bereiche\Standardapplikation\Skript-Aufgabe\workspace1\logs
del /q /f "C:\Users\SpraulT\Desktop\test.txt" 2>nul

for /f "tokens=" %%i in ('dir /b /s .txt') do (
  findstr /i /n /c:"nocturne-s01" "%%i" >nul 2>&1 && (
    echo %%i >> "C:\Users\SpraulT\Desktop\test.txt"
  )
)
if not exist "C:\Users\SpraulT\Desktop\test.txt" (
  echo Es wurde keine Treffer erzielt
)
pause
exit /b   

Vielleicht kann mir jemand die Lösung oder Ansätze bereitstellen, da ich schon bei Punkt 2 scheitere. Ich brauche einfach Unterstützung. Die Lösung möchte ich selber finden.. aber ich benötige eben Hilfe.

Vielen Dank



Computer, Windows, Technik, Programmierung, cmd, Informatik, Scripten, Batch-Datei, powershell
3 Antworten
Powershell Gui neben anderen Code laufen?

Wie kann man bei Powershell eine Gui laufen lassen, aber gleichzeitig im Hintergrund noch Code?, d. h. das die Gui nicht den rest blockiert.

GUI (gekürzt wegen Maximale Länge)


        $this.photos = Get-ChildItem -Path '..\photo'
        $this.img = [System.Drawing.Image]::Fromfile($this.currentPicPath);

        [System.Windows.Forms.Application]::EnableVisualStyles();
        $this.form = New-Object Windows.Forms.Form
        $this.form.Text = "Hochzeitsbild"
        $this.form.Width = $this.img.Size.Width;
        $this.form.Height =  $this.img.Size.Height;
        $this.form.WindowState = "Maximized"
        $this.form.SizeGripStyle = "Hide"
        $this.form.ShowInTaskbar = $False

        $this.pictureBox = new-object Windows.Forms.PictureBox
        $this.pictureBox.Width =  $this.img.Size.Width;
        $this.pictureBox.Height =  $this.img.Size.Height;

        # BUTTON 
        # Create Button and set text and location
        $this.button = New-Object Windows.Forms.Button
        $this.button.text = "Drucken"
        $this.button.Width = "150"
        $this.button.Height =  "150"
        $this.button.Location = New-Object Drawing.Point 150,0
        #$this.image = [System.Drawing.Image]::FromFile('..\img\print1.png')
        #$this.button.Image = $this.image

        # INPUT HANDLER BUTTON – ON CLICK IN THIS CASE
        # Set up event handler to exit


        # Next Button
        # Create Button and set text and location
        $this.buttonLast = New-Object Windows.Forms.Button
        $this.buttonLast.text = "Letztes"
        $this.buttonLast.Location = New-Object Drawing.Point 0,0
        $this.buttonLast.Width = "150"
        $this.buttonLast.Height =  "150"

        # Next Button
        # Create Button and set text and location
        $this.buttonNext = New-Object Windows.Forms.Button
        $this.buttonNext.text = "Nächstes"
        $this.buttonNext.Location = New-Object Drawing.Point 300,0
        $this.buttonNext.Width = "150"
        $this.buttonNext.Height =  "150"


        # INPUT HANDLERPRINT BUTTON – PRINT IMAGE
        # print button – on click send print order
        $this.button.add_click({

        $global:Gui.button.Enabled=$false
    
        Start-Process -FilePath $global:Gui.currentPicPath –Verb Print 

        Start-Sleep -s 15
        $global:Gui.button.Enabled=$true
        })

        # ADD CONTROLS TO FORM
        $this.form.controls.add($this.button)
        $this.form.controls.add($this.buttonNext)
        $this.form.controls.add($this.buttonLast)
        #$this.form.controls.add($this.label)
        #$this.form.controls.add($this.textfield)

        # DISPLAY DIALOG
        $this.pictureBox.Image = $this.img;
        $this.form.controls.add($this.pictureBox)
        #$this.form.Add_Shown( { $this.form.Activate() } )
        #$this.form.Show();

    }
  [void]showForm($isShow){
        [System.Windows.Forms.Application]::Run($this.form)

  }


Computer, skript, powershell
1 Antwort
Powershell Scipt um Dateien älter 30 Tage zu löschen?

Hallo

Ich bin in Powershell nicht wirklich fit.

Und zwar benötige ich ein Script:

Bei einem Kunden kopiere ich Backups (vom Tag) täglich auf einen freigegebenen Netzwerkpfad. Am Ende des Monats soll dann immer das Backup vom letzten Tag im Monat (also entweder vom 28,29,30, oder 31. das ist jai mmer unterschiedlich) in einen Unterordner "Monatssicherungen" verschoben werden. Danach soll immer das ältester Backup nach 30 Tagen gelöscht werden. Der Ordner "monatssicherungen" der sich ebenfalls in diesem Verzeichnis befindet, soll aber von der Suche nach alten Dateien ausgeschlossen werden.

es gibt dafür schon ein Powershell Script, was mein Vorgänger mal angelegt hat, aber diese löscht nach dem verschieben in den Ordner Monatssicherung, alle andern Backups der letzten 30 Tage. ich möchte aber nur, dass das älterste (>30) gelöscht wird. was müsste ich dazu am vorhanden Powershell Script ändern?:

If (!(Test-Path x:))
{
$net = new-object -ComObject WScript.Network
$RemoteShare = '\Filer10\RailSysbackup'
$net.MapNetworkDrive("x:", $RemoteShare, $false, "Domäne\User, "password")
}
$files = gci 'x:\' -Filter .zip | ?{$_.LastWriteTime.toString('yyyyMM') -eq (get-date).AddMonths(-1).toString('yyyyMM')} | sort LastWriteTime -Desc 
$files | select -First 1 | move-item -Destination 'x:\Monatssicherung' -Force 
$files | select -skip 1 | remove-item -Force
Computer, Backup, powershell
2 Antworten
Powershell Autmatische Löschung?

Ich habe mit einem Freund ein Skript gemacht welches Automatisch alle Daten löscht. Jedoch möchten wir dass das Skript in den Ordern die neuste und älteste Datei nicht löscht.

Das Skript haben wir schon..

$date = Get-Date -UFormat "%Y_%m_%d"

$oldTime = [int]30 # 30 days

$logPath = “C:\Scripts\Logs\$date.log”

$errorLogPath = “C:\Scripts\Logs\$($date)_error.log”

$time = Get-Date -UFormat "%T"

$startime = date

 

 

"Starting run at $time

n" &gt;&gt; $logPath</p><p><br></p><p>"Starting run at $time
n" >> $errorLogPath

foreach ($path in Get-Content "pathList.txt") {

# Write information of what it is about to do

"Trying to delete files older than $oldTime days, in the folder $path" >> $logPath

# deleting the old files

Get-ChildItem $path -File -Recurse | WHERE {($_.LastWriteTime -le $(Get-Date).AddDays(-$oldTime))} | 

  ForEach-Object {

    "Deleting file $($_.FullName)" >> $logPath

    Remove-Item $_.FullName -Force -ErrorAction Continue

    if ((Get-Item $_.FullName -ErrorAction SilentlyContinue) -ne $null) {

      "File could not be deleted: $($_.FullName)" >> $errorLogPath

    }

  }

  "

n" &gt;&gt; $logPath</p><p>&nbsp;&nbsp;"
n" >> $errorLogPath

  $erroredFolders = New-Object "System.Collections.Generic.List[String]"

   

  while ($true) {

    $folders = Get-ChildItem "$path**" -Directory -Recurse | 

      WHERE {((Get-ChildItem $_ | Measure-Object).Count -eq 0)} |

      WHERE {($erroredFolders.Contains($_) -ne $true)}

     

    if ($folders.Length -eq 0) {

      break

    }

    "Trying to delete empty folders" >> $logPath

    $folders | ForEach-Object {

      "Deleting empty folder $($_.FullName)" >> $logPath

      Remove-Item $_ -Force -Recurse -ErrorAction Continue

      if ((Get-Item $_ -ErrorAction SilentlyContinue) -ne $null) {

        "Folder could not be deleted: $($_.FullName)" >> $errorLogPath

        $erroredFolders.Add($_.FullName)

      }

     }

   }

 

  "

n
n
n
n
n" &gt;&gt; $logPath</p><p>&nbsp;&nbsp;"
n
n
n
n
n" >> $errorLogPath

}

# Benötigte Zeit

$endtime = date

$time2 = $endtime - $startime

Write-Host "$($time.Hours)h:$($time.Minutes)m:$($time.Seconds)s:$($time.Milliseconds)ms" -BackgroundColor Magenta

"Benötigte Zeit $time2 `n" >> $logPath






PC, powershell
1 Antwort
Wie kann ich im folgendem Powershell Script eine Farbige Ausgabe erzielen?

Habe folgenden Code, welcher auch funktioniert: #_________________________HAUPTPROGRAMM_______________________________________________________________________________________________________________________________________________________________________#

$empfaengerMail = Get-Content "C:\Users\ms\Desktop\empfaenger.txt"
$datum = get-date -uFormat "%d.%m.%Y"
$wochentag = Get-Date -format dddd
$kalenderwoche = [System.Globalization.DateTimeFormatInfo]::CurrentInfo.Calendar.GetWeekOfYear((get-date),2,1)
$servers = Get-Content "C:\Users\ms\Desktop\Servers.txt"

    $ab = gwmi Win32_LogicalDisk -ComputerName $servers -Filter "DriveType='3'" | select Systemname,DeviceID,@{n="Speicherplatz (GB)";e={"{0:F2}" -f ($_.Size / 1GB)}},@{n="Freier Speicherplatz (GB)";e={"{0:F2}" -f ($_.Freespace / 1GB)}}
    $ab | Sort-Object Systemname | Format-List -GroupBy Systemname | Out-File "C:\Speicherplatz CST-Server\Speicherplatz_$datum.txt" -Encoding UTF8



#_________________________VERSENDEN DER LOGFILES_____________________________________________________________________________________________________________________________________________________________#


#_________________________VERSENDEN VIA SMTP_________________________________________________________________________________________________________________________________________________________________#
$emailSmtpServer = "dominica.cst.lokal"
$emailSmtpServerPort = "587"
$emailSmtpUser = "benutzername"
$emailSmtpPass = "passwort"
$attachment = "C:\Speicherplatz CST-Server\Speicherplatz_$datum.txt"

$attach = New-Object Net.Mail.Attachment($attachment)
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.Attachments.Add($attach) 
$emailMessage.From = "Speicherplatz Manager <support@creativesoftware.de>"
$emailMessage.To.Add( "support@creativesoftware.de" )
$emailMessage.Subject = "CST: Speicherplatz Übersicht am $wochentag KW$kalenderwoche"
$emailMessage.IsBodyHtml = $true
$emailMessage.Body = @"
<p>Speicherplatz von CST in Übersicht</p>
<p></p>
<p>Anbei der Speicherplatz als Textdatei angehängt!</p>
<p></p>
<p>Stand: $datum</p>
"@
 
$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
 
$SMTPClient.Send( $emailMessage )


Dies wird alles in einer schönen HTML Tabelle ausgegeben. Nun möchte ich, dass das Feld mit Freespace rot wird, wenn es unter 15% fällt.... Ich weiß aber nicht wie das geht

HTML, powershell
1 Antwort
Hallo Ich habe ein Pwoershell Programm. Und will eine Fehlermeldung beheben?

Bei Diesem Spiel habe ich das Problem das, wenn Spieler 1 einen Buchstaben eingibt es eine Fehler Meldung gibt. Jedoch geht das Programm dan weiter. Das heisst das dan Spieler 2 dran wen dieser ein eZahl eingibt, gewinnt MEISTENS trozdem Spieler 1. Wieso und Wie kann ich die Fehlermeldung abfangen dass, Spieler 2 nicht gewinnt.

Write-host "Es gibt 2 Spieler. Jeder Spieler gibt Eine Zahl ein der, der Näher ist gewinnt." Write-Host "Die Zahl ist Zwischen Null und 100. Drücken Sie Enter um zu beginnen."

clear

$r = Get-Random -Minimum 0 -Maximum 100

[int]$a = Read-Host "Spieler 1 bitte Zahl eingeben"

try {

[int]$a = Read-Host } catch {

Write-Host "Dies ist keine Zahl, bitte geben Sie eine Zahl ein!" }

[int]$b = Read-Host "Spieler 2 bitte Zahl eingeben"

Die Fehler Meldung Ist:

Es gibt 2 Spieler. Jeder Spieler gibt Eine Zahl ein der, der Näher ist gewinnt. Die Zahl ist Zwischen Null und 100. Drücken Sie Enter um zu beginnen.

Der Wert "h" kann nicht in den Typ "System.Int32" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format." Bei C:\Users\nartuc\Desktop\Spiel-Nazli.ps1:5 Zeichen:8 + [int]$a <<<< = Read-Host "Spieler 1 bitte Zahl eingeben" + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException

Die Zahl ist 22. Spieler 1 gewinnt!

So und nun gewinnt Trotz dem Spieler 1...

Vielen Dank im voraus

Gruss

programmieren, powershell
1 Antwort
PowerShell: "Es wurde kein Positionsparameter gefunden, der das Argument "+" akzeptiert." Wie löse ich das?

Hi

Es geht um Reports... Programmiert wurde es mit PowerShell ISE

Hier der Fehler:

Rename-Item : Es wurde kein Positionsparameter gefunden, der das    Argument  "+" akzeptiert.
In Zeile:34 Zeichen:1
+ rename-item "c:\Reporting\Report_Telephone_" + $todaydate[0] +'-' + $todaydate[1 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Rename-Item], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RenameItemCommand

hier mein Code:

#today's date (year-month-day)
$todaydate = Get-Date -Format yyyy-MM-dd

#arrays  (today => systemtime)
$todaydate = $todaydate.Split('-')
$todaydate[0] #year
$todaydate[1] #month
$todaydate[2] #day

#arrays yesterday (systemtime - one day)
$yesterdaysdate = Get-Date((Get-Date).AddDays(-1)) -Format yyyy-MM-dd
$yesterdaysdate = $yesterdaysdate.Split('-')
$yesterdaysdate[0] #year
$yesterdaysdate[1] #month
$yesterdaysdate[2] #day

#arrays yesterday (systemtime - one day)
$lastmonth = Get-Date((Get-Date).AddMonths(-1)) -Format yyyy-MM-dd
$lastmonth = $lastmonth.Split('-')
$lastmonth[0] #year
$lastmonth[1] #month
$lastmonth[2] #day


#Example 1:  Filename "Report_Telephone_yyyy-mm" => in this case "Report_Telephone_2016-12"
#it renames the file -> minus one month, so the name must be "Report_Telephone_2016-11"
$filename='Report_Telephone_'+ $lastmonth[0]+'-'+ $lastmonth[1] + '.xlsx'
$filemonth = [int][regex]::Match($filename, '\w+_\d+_(\d+)').Groups[1].Value
$filemonth = "{0:D2}" -f ($filemonth - 1)

write-host $filename
rename-item "c:\Reporting\Report_Telephone_" + $todaydate[0] +'-' + $todaydate[1] + ".xlsx" -NewName $filename

$sourcepath='C:\Reporting\'+ $filename
write-host $sourcepath
$destinationpath='C:\Reporting\'+ $lastmonth[0]+'\'+ $lastmonth[1]
write-host $destinationpath
if(test-path $destinationpath)
{

} 
else 
  {
     mkdir $destinationpath
  }
move-item -path $sourcepath -destination $destinationpath

Hat einer ne Idee, wie ich das lösen könnte? Thx im vorraus :3

PC, Computer, Windows, IT, programmieren, Programmierung, Informatik, PS, Report, Script, Reporting, powershell, Powershell ISE
1 Antwort
Täglicher automatisierter Vergleich zweier csv Dateien?

Hallo,

da ich leider nicht alle technischen Begriffe richtig kenne und deshalb evtl. hier falsch verwende bereits vorab die Bitte um Entschuldigung.

Ich bekomme täglich eine csv Datei mit Daten aktueller, also zum heutigen Tag angestellten, Mitarbeitern. Hier steht bspsweise Personalnummer (eindeutiger Schlüssel), Nachname, Vorname,Eintrittsdatum und Austrittsdatum (Achtung: Das Austrittsdatum stimmt leider nicht immer). Zur Veranschaulichung die Datumsangaben mal weggelassen.

...

124514; Müller; Jonas;

231423; Fischer, Joachim;

423313; Haupt, Christian;

...

Sobald ein Mitarbeiter nicht mehr aktiv ist (also aus der Firma ausgetreten ist) wird der Datensatz am folgenden Tag auch nicht mehr übergeben (kommt also in der aktuellen csv Datei nichtmehr vor).

Es würde also am Folgetag die csv folgendermaßen aussehen, wenn Müller das Unternehmen verlassen hat und Newbie beispielsweise neu angefangen hat. Die Neueintritte müssen nicht abgefangen werden, wollte ich nur als Info dazusagen, dass diese dann zusätzlich in der neuen Datei vorhanden sind. Es geht ausschließlich um die Austritte, also die Mitarbeiter die in Vortagsdatei vorkamen, jetzt in tagesaktuellen aber nicht mehr vorkommen.

...

231423; Fischer, Joachim;

423313; Haupt, Christian;

599999; Newbie, Franziska;

...

Da das Austrittsdatum, welches auch mitgeliefert wird, leider teilweise nicht korrekt ist, kann ich mich nicht auf dieses Feld verlassen und irgendwie danach gehen. Auch haben beispielsweise unbefristete Mitarbeiter hier keinen Eintrag.

Ich bin nun auf der Suche nach einer Möglichkeit, wie ich die täglichen Austritte abfangen kann, also die Differenz zwischen mitgelieferten Daten der aktuellen Datei gegenüber der zum Vortag vergleichen kann. Dies sollte jeden Tag automatisiert funktioniert (durch einen Windows Dienst?)

Meine Idee war, dass ich diese beiden csv Dateien Datei H (Heute, im Beispiel oben die Datei mit Newbie) und Datei H-1 (gestern, Datei mit Müller) täglich vergleichen lassen und mir die Austritte jeweils in eine extra Datei, egal ob csv oder Excel, ausgeben lasse, sodass ich am Ende jeden Monats alle Austritte nochmal überprüfen kann.

Im obrigen Beispiel sollte dann beispielsweise der Datensatz zu Herrn Müller in eine Datei übergeben werden inkl den mitgelieferten Informationen wie Eintrittsdatum und Co. und wenn möglich dem aktuellen Tag (oder Zeitpunkt/aktueller Zeitstempel, damit nachvollzogen werden kann, wann genau dieser Mitarbeiter ausgetreten ist)

Leider fehlt mir jede technische Idee, wie ich sowas am schlausten umsetze und technisch realisiere. Hierfür wäre ich euch sehr über eure Ideen dankbar! Ich will ungern zunächst in eine komplett falsche Richtung laufen und danach bemerken, dass dies mir diesem System nicht umsetzbar ist.

Da dies wohl meine Mammutsaufgabe in meinem Praktikum sein wird, bin ich demjenigen, der sich hier die Zeit nimmt, mir bei der Lösungsfindung zu helfen, natürlich sehr, sehr dankbar! Vielen dank!

Excel, makro, VBA, Programmierung, skript, csv, powershell, Windows Dienst
2 Antworten

Meistgelesene Fragen zum Thema Powershell

PowerShell: "Es wurde kein Positionsparameter gefunden, der das Argument "+" akzeptiert." Wie löse ich das?

1 Antwort

Unterschied zwischen Powershell und CMD

3 Antworten

Wie kann ich bei Powershell den Ordnerinhalt löschen?

1 Antwort

Unterschied zwischen Ordner und Verzeichnis?

3 Antworten

VM Server Startet immer im Abgesicherten modus, wie deaktivieren?

1 Antwort

Powershell - Script alle 30/60 sekunden ausführen

2 Antworten

Den Befehl "powershell" wieder verfügbar machen durch Umgebungsvariable PATH ändern/zurücksetzten wie?

1 Antwort

runas als Admin und trotzdem Zugriff verweigert?

2 Antworten

Powershell mit cmd öffnen ?

2 Antworten

Powershell - Neue und gute Antworten