Sayı komutunu kullanarak copy komutunu kullanarak dosyaları birleştirmek için toplu komut dosyası


-1

Birisi bana bu isteği ile yardımcı olabilir eğer sevinirim.

HERHANGİ bir dosya sayısı için aşağıdaki komutu yapabilen bir dinamik toplu komut dosyasına ihtiyacım var :

Copy 1.txt + 2.txt + 3.txt + 4.txt newfile.txt

Aşağıdaki dosyalar varsa:

1.txt

2.txt

3.txt

...yakında

Ve deniyorum: Copy *.txt newfile.txt Birleşirken doğru şekilde sıralanmıyor. Aslında bunu yapması biter:Copy 3.txt + 4.txt + 2.txt + 1.txt newfile.txt

Ayrıca, copy komutunu kullanıp ihtiyacım olan type komutunu da kullanmam gerekiyor .

Bunu yapmak için uygun bir yol bulamadım çünkü FOR döngüsü örneklerinin çoğu çevrimiçi TYPE kullanıyor ve elde etmeye çalıştığım şey için uygun değil.

Yardımınız için çok minnettarım!


SuperUser'a hoş geldiniz. [Konuya] göre, sorunuz daha çok stackoverflow.com'a ait . Ancak bu çok garip: Copy *.txt newfile.txtkomut, dosyaları kopyalarımdaki gibi listeleyerek, Windows 8'imde alfabetik sırada birleştiriyor dir /B /O:N *.txt. Lütfen sorunuzu düzenleyin ve En Az, Tamamlandı ve Doğrulanabilir bir örnek paylaşın .
JosefZ

Hızlı yanıtınızı ve buraya yazdığınız için özür dileriz :) :) Soruyu güncellediniz.
İkili yüzer

Ayrıca dosyalarınızın neden sırayla kopyalanmadığını da merak ediyorum. COPY komutunun DIR siparişi ayarlarını takip etmesi mümkündür. Bunu ayarlamak için DIRCMD ortam değişkenini kullanarak dosyalarınızı adlarına göre sıralayın set DIRCMD=/OGN. Ardından kopya komutunuzu deneyin.
Kody Brown

Yanıtlar:


1

copyBirleştirilmiş dosyaların sıralamasını değiştireceğine inanamıyorum . Ancak, sonraki self_explaining betiği size yardımcı olabilir:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

pushd d:\bat\files\folder

REM echo(&echo SHOW files to be merged in different sort order 
REM erase newfile.txt 2>NUL
REM @ECHO ON
REM @for %%G in (
REM   "/-C" "/O:N" "/O:S" "/O:E" "/O:D /T:C" "/O:D /T:W"
REM   ) do dir %%~G *.txt|findstr "\.txt$"
REM @ECHO OFF

echo(&echo RESULT: copy *.txt newfile.txt
erase newfile.txt 2>NUL
rem (optional): to throw away trailing `Ctrl+Z`, use `/B` switch as follows:
rem copy /Y *.txt newfile.txt /B  
@ECHO ON
copy /Y *.txt newfile.txt
findstr "^" *.txt
@ECHO OFF

echo(&echo(&echo RESULT: merge *.txt in defined order: change `/O` switch
echo(
type nul> newfile.txt
set /A "_files=0"
for /F "delims=" %%G in ('
  dir /B /O:N *.txt
  ') do @if not "%%G"=="newfile.txt" (
            echo(%%~G
            set /A "_files+=1"
            copy /Y newfile.txt + %%~G newfile.txt /B >NUL
        )
echo       %_files% file^(s^) merged.
rem (optional): to add trailing `Ctrl+Z`, remove `REM` in next line  
REM copy newfile.txt + NUL newfile.txt >NUL
@ECHO ON
findstr "^" *.txt
@ECHO OFF
popd

REM-Commented code snippet pushdkomutunu izleyen komutların, eğer istenmediyse (tümü REMkaldırıldıysa) farklı sıralama düzeninde birleştirilecek dosyaları göstereceğini unutmayın . Hata ayıklama amacıyla burada tutuyorum.

Sonuç :

==> D:\bat\SU\1002948.bat

RESULT: copy *.txt newfile.txt

==> copy /Y *.txt newfile.txt
1.txt
2.txt
3.txt
4.txt
        1 file(s) copied.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44
newfile.txt:→

RESULT: merge *.txt in defined order: change `/O` switch

1.txt
2.txt
3.txt
4.txt
      4 file(s) merged.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44

==>

Burada arka içinde sağa doğru sembol ok newfile.txttemsil EOF(dosyanın sonuna, onaltılı 0x1A, örneğin) Ctrl+ Z.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.