Rok temu odwiedził mnie kolega pracujący w TPSA i poprosił o pomoc. Chodziło mu o napisanie pliku wsadowego (lub dopisanie kilku linijek do pliku autoexec.bat) tak, by przy codziennym uruchamianiu komputera tworzył się katalog o nazwie będącej datą. Do dzisiaj mnie gnębi ten problem :] Macie jakiegoś pomysła?
Noo.. w końcu jakieś ciekawe pytanie na forum...
Przyznam, że siedzę od ponad godziny i mi się nie udało - mam tylko jeden problem - jak odpalić plik wsadowy aby parametrem była zawartość innego pliku. Myślałem o czymś takim:
plik.bat < type plik.txt
ale to próbuje otworzyć plik 'type' (czy mi się wydaje czy pod starszym dosem to działało?)
również zabawa ze strumieniami (|) nie dała rezultatu. Gdybym tylko przeskoczył ten problem to miałbym rozwiązanie na Twoją ciekawą zagwózdkę.
Gdybym tylko przeskoczył ten problem to miałbym rozwiązanie na Twoją ciekawą zagwozdkę.
Gdyby babcia... :D A tak poważnie to bardzo interesujący problem. Wiem, że jak taki mózg jak Marooned nie wymyślił to nie ma sensu próbować, ale próbowałem i doszedłem do takich samych wniosków: dałoby się gdzyby... :D
// Aha i zagwozdka się pisze
nie wiem jak u Was ale u mnie pod win xp jest zmienna %date% a co dalej juz mowic chyba nie musze
Przyznam, że siedzę od ponad godziny i mi się nie udało - mam tylko jeden problem - jak odpalić plik wsadowy aby parametrem była zawartość innego pliku. Myślałem o czymś takim:
plik.bat < type plik.txt
A nie tak po prostu:
plik.bat < plik.txt
nie wiem jak u Was ale u mnie pod win xp jest zmienna %date% a co dalej juz mowic chyba nie musze
Skrypt ma działać pod dosem, a jak sobie wpiszesz w konsoli w XP:help set to możesz tam przeczytać m.in.:
(...)Przy włączonych rozszerzeniach poleceń(...)
Sprawa jest rozwiązana w asmie w następujący sposób, ale ja potrzebuję tutaj pliku wsadowy dla DOS/Windows.
.model tiny
.code
org 100h
start: jmp poczatek
bcd2asc PROC NEAR
;**************************************************************
;* Procedura zamienia dwucyfrowe liczby zapisane w kodzie BCD *
;* na dwa znaki ASCII *
;**************************************************************
push CX
mov AL,BH
mov AH,BH
and AL,0Fh
add AL,30h
mov CL,04h
shr AH,CL
and AH,0Fh
add AH,30h
pop CX
ret
bcd2asc ENDP
;******************************
;* Poczatek glownego programu *
;******************************
poczatek:
; mov AX,CS ; Zrownanie segmentow CS i DS na wypadek
; mov DS,AX ; skompilowania programu do postaci EXE
mov AH,04h ; Pobranie aktualnej daty z ukladu RTC
int 1Ah ; z plyty glownej komputera (od PC/AT wzwyz)
jc zakoncz ; Jesli blad to zakoncz prace
mov SI, offset bufor ; Do SI adres bufora nazwy katalogu
mov BH,CL ; Pobierz dwie ostatnie cyfry roku
call bcd2asc ; Zamien na znaki ASCII
mov byte ptr [SI],AH ; i zapisz do bufora nazwy
mov byte ptr [SI+1],AL
mov BH,DH ; Pobierz miesiac
call bcd2asc
mov byte ptr [SI+3],AH
mov byte ptr [SI+4],AL
mov BH,DL ; Pobierz dzien miesiaca
call bcd2asc
mov byte ptr [SI+6],AH
mov byte ptr [SI+7],AL
mov DX,SI ; Do DX offset bufora nazwy katalogu
mov AH,39h ; Funkcja tworzy katalog o nazwie w DS:DX
int 21h ; nazwa musi byc lancuchem ASCIIZ
zakoncz: mov ax, 4C00h ; Wyjscie do DOS-u
int 21h
bufor db 00h, 00h, 2Dh, 00h, 00h, 2Dh, 3 dup (00h)
end start
Jesli w Windows, to moze taki skrypcik:
'plik data.vbs
set Folder = CreateObject("Scripting.FileSystemObject")
if not Folder.FolderExists("c:\"&Date()) then
Folder.CreateFolder("c:\"&Date())
end if
Głupie i lamerskie wyjście, aczkolwiek kiedyś z niego korzystałem w innym celu (mój patent, Zawiercie '95 - miałem 6 lat jak to napisałem):
plik autoexec.bat:
@Echo off
if "%1"=="DATA" goto data
copy wywolaj.inc temp.bat >nul
echo. |date>>temp.bat
temp.bat %0
goto koniec
:data
del temp.bat >nul
if exist %5\readme.txt goto autoexe
mkdir %5 >nul
echo To jest plik w nowym folderze o nazwie aktualnej daty >%5\readme.txt
goto autoexe
:autoexe
rem TUTAJ PRAWDZIWA TRESC PLIKU AUTOEXEC.BAT
:koniec
echo on
plik wywolaj.inc:
@Echo off
%1 DATA
^ ważne żeby po "DATA" była jedna spacja odstępu i żadnej nowej linii
troche latek minęło od tamtego czasu ale do dzisiaj nie umiałbym chyba wymyśleć innego rozwiązania :/ a to działa tylko pod warunkiem że polecenie "data" zwróci coś w podobnym formacie :P
Adamo - szacuneczek...
Uprościłem nieco Twój kod:
Plik.bat
<font color="brown">
@echo off
if not !%1 == !data goto dalej
del MakeDate.bat > nul
md %5 > nul
goto end
:dalej
copy MakeDate.inc MakeDate.bat > nul
echo. | date | find "data" >> MakeDate.bat
MakeDate.bat %0
:end
</span>
MakeDate.inc
<font color="brown">%1 data
</span>
<font size="1">(oczywiście spacja na końcu)</span>
Ale jest problem:
C:>md 2005.01.07
Utworzenie katalogu nie jest możliwe
Jeśli po czystym dosem date zwraca rok jako 2005-01-07 to zadziała, ale jak będą kropki jak pod Win2k to już nic się nie poradzi.