Finden Sie den Wochentag in der Batch-Datei? (Windows Server 2008)

7

Ich habe einen Prozess, den ich aus einer Batchdatei ausführe, und ich möchte ihn nur an einem bestimmten Wochentag ausführen.
Ist es möglich, den Wochentag zu bekommen?

Alle Beispiele, die ich gefunden habe, stützen sich irgendwie auf "Datum / t", um "Freitag, 11.12.2009" zurückzugeben. In meinem Computer gibt "Datum / t" jedoch "11.12.2009" zurück. Kein Wochentag da.

Ich habe bereits die "regionalen Einstellungen" für meinen Computer überprüft, und das lange Datumsformat enthält den Wochentag. Das kurze Datumsformat funktioniert nicht, aber ich möchte das lieber nicht ändern, da es eine Reihe von Dingen betrifft, die ich mache.

Daniel Magliola
quelle
besser auf SF``?

Antworten:

10

Ich bin etwas spät zu dieser Party, aber das gibt dir den Wochentag:

wmic path win32_localtime get dayofweek

Verwenden Sie eine Batch-for-Schleife, um die Ausgabe zu erhalten, und Sie haben eine testbare Bedingung für den Wochentag.

rauben

RobW
quelle
Wie speichere ich das in einer Variablen?
Saeed Neamati
Platzieren Sie es in einer for-Schleife - wie: for / f "skip = 1"% a in ('wmic path win32_localtime get dayofweek') do @echo% a. Denken Sie daran, %% a als Variable zu verwenden, wenn Sie es in ein Skript einfügen.
RobW
5

Hier ist eine Batch-Datei, in der alle Datums- und Uhrzeitinformationen in Variablen gespeichert werden. Dies hängt jedoch davon ab, ob auf Ihrem Computer ein geeignetes Datumsformat festgelegt ist. Außerdem muss die Reihenfolge möglicherweise je nach lokalem Datumsformat angepasst werden. Ich bin mir nicht sicher.

@echo off
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set WD=%%i
set D=%%j
set M=%%k
set Y=%%l
) 

for /F "tokens=1-4 delims=: " %%i in ('time /t') do (
set H=%%i
set Mn=%%j
set AP=%%k
)

if "%AP%"=="PM" set /A H=%H%+12

echo %WD% %D%/%M%/%Y% - %H%:%Mn%

Das gewünschte Bit ist in% WD%.

John Gardeniers
quelle
Ich habe ähnlich wie in einer Batch-Datei verwendet, die täglich ausgeführt wurde, um den Tag zu identifizieren und nur an einem bestimmten Tag eine Codezeile auszuführen.
HaydnWVN
1
Was machen Sie, wenn 'date / t' nur '01 / 15/2015 'zurückgibt?
RobW
4

Hier ist die richtige Antwort für ein BAT-Skript auf einem modernen System:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
echo %dow%

Ausgänge:

Saturday

Verwendungszweck:

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set dow=%%i
if %dow% == Saturday goto shutdown
if %dow% == Sunday goto shutdown
exit

:shutdown
shutdown /s /f /t 90

Ich habe dies für PCs verwendet, die täglich automatisch aus dem BIOS booten und keine Option zum Ausschließen von Wochenenden haben.

Nebenbei: ACPI ist eine zuverlässigere Methode, um dies zu tun, und ermöglicht die Verwendung eines Dummy-BAT-Skripts exit, das beispielsweise in einer geplanten Windows-Aufgabe mit bestimmten ausgewählten Tagen verwendet wird. Verwenden Sie dazu die Option Computer aufwecken, um diese Aufgabe auszuführen .

Danny Beckett
quelle
4

Batch kann das nicht einfach machen. Es erfordert viel Befehlszeile mit dem Befehl date. Es gibt einige Möglichkeiten, um das zu erreichen, wonach Sie suchen, aber vor allem frage ich mich, warum der integrierte Taskplaner keine Option ist. Hier können Sie die Tage angeben, an denen es ausgeführt werden soll, und zu welcher Zeit:

Alt-Text

Sie können auch VBScript verwenden:

wscript.stdout.writeline weekdayname(weekday(date))

Dann führen Sie es aus:

C: \ Dokumente und Einstellungen \ Administrator> cscript / nologo dayofweek.vbs
Mittwoch

Sie können die if / else-Logik in VBScript problemlos verwenden und dann Ihren VBScript-Code je nach Tag Batch-Dateien ausführen lassen und umgekehrt (Batch-Aufruf eines VBScript).

John T.
quelle
Ich habe im Grunde eine Batch-Datei, die eine Menge Dinge (Backups) macht, und einige dieser Sachen (RIESIGE Ordner, die nicht so wichtig sind und sich nicht oft ändern). Ich möchte sie nur einmal pro Woche machen, um Stunden zu sparen tägliche Zeit. Ich KANN die Batch-Datei in viele aufteilen und den Scheduler verwenden, um dies zu steuern, aber es macht alles für mich viel komplizierter, da die Dinge, die ich wöchentlich tun muss, nach einigen und auch vor einigen der täglichen (insbesondere ich) geschehen Brennen Sie jeden Tag eine DVD, nachdem das Backup abgeschlossen ist, und das muss geschehen, nachdem die lang laufenden Aufgaben erledigt sind (was schwer abzuschätzen ist)
Daniel Magliola
Eine sehr praktikable Lösung kann darin bestehen, dass der Taskplaner an den gewünschten Tagen eine Flag-Datei erstellt. Die Hauptstapeldatei kann das Vorhandensein dieser Flag-Datei überprüfen und die Verarbeitung entsprechend ändern. Vergessen Sie nicht, auch die Flag-Datei zu löschen.
John Gardeniers
2
@echo off

:set the variables
for /f %%C in ('wmic path Win32_LocalTime Get Year^,Month^,Day^,Hour^,Minute^,Second /Format:List 2^>nul ^| find "="') do @set current%%C

:display the variables
set current

Jetzt müssen nur noch Nullen an Tag und Monat angehängt werden, wenn eine von beiden weniger als 10 beträgt.

Ritter Ritter
quelle
2

Meine Antwort basiert auf RobWs Antwort, aber er gibt einfach den Wochentag wieder, während die Frage lautete, wie der Verlauf des Skripts je nach Wochentag geändert werden kann (genau das, was ich auch tun wollte). Nun, es stellte sich als weniger einfach heraus, als es sich anhört, weil die FORSchleife irgendwie zwei Zeilen anstelle von einer verarbeitet und die zweite (die leer zu sein scheint) die Skriptausführung unterbricht.

Die einzige FORSchleife, die tatsächlich für mich funktioniert hat, ohne die Ausführung zu unterbrechen, ist die folgende:

for /F "skip=1" %%I in ('wmic path win32_localtime get dayofweek') do (set /a dow=%%I 2>NUL)
if %dow% geq 6 goto ok
echo You can run this script only on Saturday or Sunday
goto :eof
:ok
REM do more stuff here

Der 2>NULTeil unterdrückt den Fehler, der sonst während der zweiten Zuweisung angezeigt würde, während er /asich mit dem einen Leerzeichen befasst, das aufgrund der Umleitung hinzugefügt wird.

Ronny D'Hoore
quelle
1

Darf ich etwas zitieren, das ich im Internet gefunden habe:

Über das DOW-Problem ...

Win 2000 zeigt das aktuelle Datum mit der Überschrift "Wochentag" an. In Win XP erhalten Sie jedoch das bloße Datum in Ihrem Länderformat ohne DOW. Dies ist eine der kleinen Annehmlichkeiten, die die beiden (fast) Brüder betreffen, die Systeme betreiben.

Um den Trick zu umgehen, müssen Sie das von (emuliertem) DOS angezeigte Legacy-Format erzwingen

Echo.|Command /C Date|Find "current"

Das funktioniert wirklich, jetzt müssen Sie nur noch den DOW aus dem Ausgangsstring fummeln und fertig ...

Phil Swiss
quelle
Ich habe das tatsächlich gefunden, es ausprobiert und den Fehler erhalten, dass "Befehl" nicht existiert ... Ich habe tatsächlich eine Reihe von Lösungen für XP gefunden, die in Server 2008 nicht funktionieren ...
Daniel Magliola
echo% DATE: ~ 0,3%
jscott
jscott: Wie ich in der Frage erwähnt habe, gibt das Datum für mich nicht den Wochentag zurück. Nur TT / MM / JJJJ.
Daniel Magliola
Funktioniert nicht in Windows 7 Pro ...
RobW
1

Tatsächlich ist das Flag für dieses (2K8, 2K3, XP usw.) das KURZE Datumsformat.

Klicken Sie unter Regional- und Sprachoptionen auf die Schaltfläche Anpassen. Ändern Sie auf der Registerkarte DATUM das KURZE Datumsformat in "M / t / jjjj". Ändern Sie das LANGE Datumsformat in "TTTT, MMMM TT, JJJJ".

Dann wird der Wochentag angezeigt - um dies zu testen, führen Sie dies in einer Dos-Eingabeaufforderung aus: Datum / t Die Ausgabe sollte wie folgt aussehen: "Mo 31.01.2011"

Pebkac
quelle
Die vorgeschlagene Änderung der regionalen Einstellungen reicht aus, ist jedoch nicht verfügbar, wenn Ihre regionale Einstellung Kanada ist. Sie funktioniert wie beschrieben, wenn die Region auf US eingestellt ist. Ich würde sie aus Angst nicht auf einem Server ändern etwas anderes wird rausschmeißen.
1

Falls jemand es braucht, funktioniert dies für mich unter Windows 7 und XP ...

echo.|command /C date|find /i "current" >%temp%\dow.txt
for /f "tokens=1-4 delims=/ " %%i in (%temp%\dow.txt) do set DOW=%%l
echo %DOW%

Für Windows Server 2008 würde ich eine der oben vorgeschlagenen Powershell-Methoden verwenden.

Ronnie
quelle
1

Um zu vermeiden, dass Sie in eine Textdatei umleiten müssen, gibt es eine Variation des FOR, die eine Befehlszeichenfolge verwendet. Hier ist es:

@For / F "tokens = 4 delims = / -"% i In ('@Echo.^|Command / C Date ^ | Find / i "current" ') Do @Echo% i

Denken Sie daran, doppelte Prozentzeichen zu verwenden, wenn Sie diesen Befehl in ein Dos-Skript einfügen. In meinem Beispiel habe ich nach dem allgemeinen Datumsbegrenzungszeichen für Schrägstrich oder Bindestrich gesucht.

Ich bevorzuge diese Lösung, da es sich ausschließlich um DOS handelt, ohne sich darauf verlassen zu müssen, ob WMI, PowerShell usw. vorhanden sind oder nicht.

MakStir
quelle
1

Wie wäre es mit diesem für Windows 2008, viel eleganter. Funktioniert auch überall dort, wo Powershell installiert ist.

@for /F "tokens=1 delims=, " %%i In ('powershell date') do set dow=%%i
echo %dow%
Dru
quelle
1

Dank Phil Swiss vorheriger Veröffentlichung - das ist ein Vergnügen:

echo. | cmd /C date | find "current"

Anwendungsbeispiele:

echo. | cmd /C date | find /i "Fri" && echo today is Friday

Oder um umzukehren:

echo. | cmd /C date | find /i "Fri" || echo today is NOT Friday

Danke
quelle
2
Die Ausgabe vom Datum hängt von den Windows-Datums- / Uhrzeiteinstellungen ab, sodass dies in einigen Fällen möglicherweise nicht funktioniert. Zum Beispiel auf dem Server, auf dem ich gerade mit dem Datenbefehl arbeite, wird das Datum als 03.09.2013 zurückgegeben.
Juha Palomäki
1

Dies kann mit einer einfachen Berechnung erfolgen

 ::get dow number (1=monday) from dd mm yy 
 set/a a=(14-mm)/12,yr=yy-a,m=mm+12*a-2,"dow=(dd+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
Atntoni Gual
quelle
0

Ich bin in den USA. Ich kann diesen Code unter Windows 7, Windows 2008 R2, Windows Server 2003 und Windows XP ausführen (alle Betriebssysteme sind mit Windows-Updates und -Patches aktuell). Alle mit kurzer Datumseinstellung ohne ddd (oder dddd) (Wochentag).

@echo off
for /f %%a in ('date /t') do set DAY=%%a
echo.
echo The Day Is: %DAY%
echo.

Wenn heute Donnerstag ist, würde "The Day Is: Thu" ausgegeben.

Dies gibt den Tag für alle 4 Windows-Versionen zurück, auf denen ich getestet habe. Und nur der Tag. Wenn ich mein Kurzdatum-Setup auf "TTT, M / TT / JJJJ" änderte, zeigte meine Ausgabe den Tag mit einem Komma (z. B. Do) an, das besagt, dass dieser Code das Kurzdatum-Format verwendet. Was aber auch passieren kann, ist, dass wenn das kurze Datum nicht den Wochentag enthält, es möglicherweise auf das lange Datumsformat abzielt, das auf allen 4 Computern, auf denen ich getestet habe, dddd im Format hat.

Scott Gehret
quelle
Die Tatsache, dass dies auf Ihrem Computer funktioniert, beantwortet die Frage des OP nicht wirklich.
Katherine Villyard
Ich habe dies auf 4 verschiedenen Maschinen ausgeführt. Jeweils mit einem anderen Betriebssystem. Einer davon ist ein Desktop-PC (Windows 7), Server 2003 auf einem Server, Server 2008 und XP auf VMs. Ich möchte nur darauf hinweisen, dass es für mich in allen 4 Umgebungen auf 4 verschiedenen Maschinen funktioniert.
Scott Gehret
0
ECHO: I needed a more comprehensive solution using an array.
@ECHO OFF
setlocal EnableDelayedExpansion

ECHO :: Get DayOfWeek
ECHO :: Will return DayOfWeek=#
ECHO :: 
For /F "tokens=1 delims=| " %%a In ( 'wmic path win32_localtime get dayofweek /Value^|Find "DayOfWeek"' ) Do (
  Echo %%a
  set "str=%%a"
  ECHO :: Remove DayOfWeek=
  set "str=!str:~10,1!"
  ECHO !str!
)
ECHO.
ECHO :: Create vector with names of days (Index of Days)
for %%d in (Monday Tuesday Wednesday Thrusday Friday Saturday Sunday) do (
  set /A i=i+1
  set day[!i!]=%%d
  if !i!==!str! (
    ECHO :: If today what DayOfWeek is it?
    ECHO %%d
  )
)
ECHO :: 
ECHO.
ECHO :: This is how we get the value outside the loop
set index=!str!
echo(!day[%index%]! 
ECHO.
PAUSE
NetDreamz
quelle
Bitte erläutern Sie Ihren Code im Detail, da es niemandem wirklich hilft, nur eine Reihe von Codes ohne Erklärung zu veröffentlichen
Frederik Nielsen
0
#USE POWERSHELL:
cls
$Today = (Get-Date).DayOfWeek
$daylabel = $Today | select label,day |
        where dayofweek -eq 'friday' |
        select -ExpandProperty label
# End of week ( Saturday ) in OLE Automation date format.
$TimeStamp = Get-Date -Format o | foreach {$_ -replace ":", "."}
 <#
$TimeStamp
$Today
$daylabel
 #>
#Run all your scripts every day but friday
If ($daylabel -eq 'Friday'){
run script |out-file -filepath "filepath\'$timestamp.filename.txt" -Encoding UTF8
}
ELSE {do something else, like 'ECHO "No scripts will be run today."}

Wenn Sie mehrere Tage ausführen möchten, fügen Sie die folgenden Werte hinzu:

If ($daylabel -eq 'Friday','Thursday','Wednesday'){
Patrick Burwell
quelle
Das OP fragte, wie der Wochentag in einer Batch-Datei gefunden werden könne. Zeigen Sie dem OP, wie Sie Powershell aus einer Batch-Datei aufrufen oder geben Sie die Antwort als Batch-Datei an.
user5870571
0

Die von Atntoni Gual veröffentlichte Lösung funktioniert im einfachen Stapel, aber wir müssen einige Variablen zuweisen, bevor wir die Berechnung durchführen

Dies kann mit einer einfachen Berechnung erfolgen: Ermitteln Sie die Dow-Nummer (1 = Montag) aus TT MM JJ Satz / aa = (14 mm) / 12, Jahr = JJJA, m = mm + 12 * a-2, "dow = (dd + yr + yr / 4-yr / 100 + yr / 400 + 31 * m / 12) %% 7"

:: extract date from date command on OS with date format dd-mm-yyyy
for /F "tokens=1,2,3 delims=-" %%a in ('echo %date%') do (set dd=%%a & set mm=%%b & set yy=%%c)

::get dow number (1=monday) from dd mm yy 
set/a a=(14-%mm%)/12,yr=%yy%-a,m=%mm%+12*a-2,"dow=(%dd%+yr+yr/4-yr/100+yr/400+31*m/12)%%7"
Rui Paz
quelle
0

Nur eine weitere Antwort, die genau dies mit verwendet wmic

@echo off
set "d1=Mon" & set "d2=Tue" & set "d3=Wed" & set "d4=Thu" & set "d5=Fri" & set "d6=Sat" & set "d7=Sun"
for /f %%i in ('wmic path win32_localtime get dayofweek ^| findstr /r /c:[1-7]') do call echo %%d%%i%%
Gerhard Barnard
quelle
-2

Ok, habe eine Antwort gefunden ...
Ich konnte keinen Weg finden, einfache BAT-Dateien zu verwenden, aber wenn Sie Zugriff auf Powershell haben ...

@echo off
powershell date > date.txt
find/i "Fri" date.txt  > nul
if errorlevel 1 goto SkipWeeklyTasks

Do your weekly stuff here

:SkipWeeklyTasks
del date.txt

Ich hoffe es hilft...

EDIT: (für potenzielle Leute, die darüber stolpern) Dies ist böse und hässlich und sollte nicht getan werden, und andere Antworten auf diese Frage sind besser, wenn sie auf Sie zutreffen. Wenn Sie dies schnell und schmutzig in einer bereits vorhandenen Batch-Datei erledigen müssen, könnte dies jedoch für Sie funktionieren.

Daniel

Daniel Magliola
quelle
2
Urgh. Bitte. Wenn Sie dafür PowerShell verwenden müssen, geben Sie zumindest ein Ergebnis zurück, das (a) unabhängig von den Gebietsschemaeinstellungen ist [der Wochentag muss nicht vorhanden sein und muss nicht auf Englisch sein] und (b) ist leicht zu analysieren. Dies powershell "&{[int](Get-Date).DayOfWeek}"ist wahrscheinlich die bessere Antwort, und Sie können diese einfach in eine Umgebungsvariable einfügen und vergleichen.
Joey
3
Wenn Sie Powershell überhaupt verwenden möchten, können Sie das gesamte Skript auch in Powershell übersetzen.
Zypher
Zypher, das ist natürlich die offensichtliche Idee :-)
Joey
Johannes: Yah, das ist eigentlich ein Problem, das ich lösen und so schnell wie möglich loswerden muss. Es muss nur in MEINEN Maschinen funktionieren. Jede zusätzliche Sekunde, die ich damit verbringe, dies allgemeiner zu machen, als ich brauche, wird im Wesentlichen verschwendet. Zypher: Ja, aber ich hatte bereits meine Batch-Datei ausgeführt und funktionierte, und ich weiß nicht viel über PowerShell. Ich wollte nur einen Abschnitt hinzufügen, der nur einmal pro Woche ausgeführt wurde, und ihn wieder so schnell wie möglich entfernen . Aber was Sie beide sagen, ist definitiv ein guter Rat, falls jemand diese Lösung liest.
Daniel Magliola
Wenn ich mich an ein altes Skript von mir erinnere, habe ich tatsächlich eine VBScript-Datei erhalten, die das Datum in die BAT-Datei zurückgibt.
Brent Pabst
-2

Ich benutze...

for /f %i in ('cmd /c wmic path win32_localtime get dayofweek^|findstr [0-9]') do set dayofweek=%i

... um die aktuelle Tagesnummer zu erhalten.

Andreas X10D
quelle
Sie können die Verwendung von "cmd / c" vermeiden mit: für / f %% i in ('wmic path win32_localtime get dayofweek ^ | findstr [0-9]') setzen Sie dayofweek = %% i
Max
-2
for /f "skip=1" %%a in ('WMIC Path win32_LocalTime Get DayOfWeek') do if not defined dayNumber set dayNumber=%%a
Liviu
quelle
1
Es ist ein bisschen "Zauberer" Antwort: "Fügen Sie dies ein ... und es wird funktionieren". Eine gute Antwort enthält auch immer eine aussagekräftige Erklärung.
Peterh