Saya mencari untuk mendapatkan hasil dari perintah sebagai variabel dalam skrip batch Windows (lihat bagaimana mendapatkan hasil dari perintah dalam bash untuk setara dengan skrip bash). Solusi yang akan berfungsi dalam file bat. Lebih disukai, tetapi solusi scripting windows umum lainnya juga diterima.
windows
scripting
batch-file
John Meagher
sumber
sumber
Jawaban:
Jika Anda harus menangkap semua output perintah, Anda dapat menggunakan batch seperti ini:
Semua jalur output disimpan dalam VAR yang dipisahkan dengan "!".
@ John: apakah ada kegunaan praktis untuk ini? Saya pikir Anda harus menonton PowerShell atau bahasa pemrograman lain yang mampu melakukan tugas skrip dengan mudah (Python, Perl, PHP, Ruby)
sumber
cmd
sehingga saya bisa menjalankannya di sana. ... Ya, ini sama mengerikannya dengan suara. Visual Studio terkadang membuat saya ingin menangis. @ Ajedi32 Saya pikir Anda bermaksud mengatakan bahwa skrip batch adalah peninggalan yang mengerikan di masa lalu. ;)Rendah hati untuk perintah telah mengumpulkan beberapa kemampuan menarik selama bertahun-tahun:
Perhatikan bahwa
"delims="
menimpa ruang default dan pembatas tab sehingga output dari perintah tanggal akan melahap sekaligus.Untuk menangkap output multi-line, pada dasarnya masih bisa menjadi satu-liner (menggunakan variabel lf sebagai pembatas dalam variabel yang dihasilkan):
Untuk menangkap ekspresi yang disalurkan, gunakan
^|
:sumber
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
perintah langsung pada baris perintah, Anda menggunakan satu%
. Jika Anda menggunakannya dalam file batch, Anda gunakan%%
.%
, misalnya:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
perintah yang digunakan berasal dari Cygwin. Saya setuju saya seharusnya menyebutkan itu.Untuk mendapatkan direktori saat ini, Anda dapat menggunakan ini:
Ini menggunakan file temp, jadi ini bukan yang paling cantik, tapi tentu saja berhasil! 'CD' menempatkan direktori saat ini di 'tmpFile', 'SET' memuat konten tmpFile.
Berikut ini solusi untuk beberapa baris dengan "array's":
Tetapi Anda mungkin ingin mempertimbangkan untuk pindah ke shell yang lebih kuat atau membuat aplikasi untuk hal ini. Ini memperluas kemungkinan file batch sedikit.
sumber
Anda perlu menggunakan
SET
perintah dengan parameter/P
dan mengarahkan output Anda ke sana. Misalnya, lihat http://www.ss64.com/nt/set.html . Akan berfungsi untuk CMD, tidak yakin tentang file .BATDari komentar ke pos ini:
sumber
Contoh untuk mengatur dalam variabel lingkungan "V" file terbaru
dalam file batch Anda harus menggunakan awalan ganda dalam variabel loop:
sumber
Cukup gunakan hasil dari
FOR
perintah. Misalnya (di dalam file batch):Anda dapat menggunakan
%%I
sebagai nilai yang Anda inginkan. Sama seperti ini:%%I
.Dan di muka
%%I
tidak memiliki spasi atau karakter CR dan dapat digunakan untuk perbandingan !!sumber
Jika Anda mencari solusi yang disediakan di Menggunakan hasil perintah sebagai argumen di bash?
maka di sini adalah kodenya:
[Kredit] : Terima kasih atas semua jawaban lain dan beberapa penggalian di halaman perintah Windows XP .
sumber
sumber
Saya ingin menambahkan komentar ke solusi di atas:
Semua sintaks ini bekerja dengan baik JIKA PERINTAH ANDA DITEMUKAN DALAM JALAN atau JIKA PERINTAH ADALAH cmdpath TANPA RUANG ATAU KARAKTER KHUSUS.
Tetapi jika Anda mencoba menggunakan perintah yang dapat dieksekusi yang terletak di folder yang jalurnya berisi karakter khusus, maka Anda harus menyertakan jalur perintah Anda menjadi tanda kutip ganda (") dan kemudian sintaks FOR / F tidak bekerja.
Contoh:
atau
atau
Dalam hal itu, satu-satunya solusi yang saya temukan untuk menggunakan perintah dan menyimpan hasilnya dalam sebuah variabel adalah dengan mengatur (sementara) direktori default ke salah satu dari perintah itu sendiri:
Hasilnya kemudian benar:
Tentu saja dalam contoh di atas, saya berasumsi bahwa skrip batch saya terletak di folder yang sama dengan salah satu perintah yang dapat dieksekusi sehingga saya dapat menggunakan sintaks "% ~ d0% ~ p0". Jika ini bukan kasus Anda, maka Anda harus menemukan cara untuk menemukan jalur perintah Anda dan mengubah direktori default ke jalurnya.
NB: Bagi mereka yang bertanya-tanya, perintah sampel yang digunakan di sini (untuk memilih folder) adalah FOLDERBROWSE.EXE. Saya menemukannya di situs web f2ko.de ( http://f2ko.de/en/cmd.php ).
Jika ada yang memiliki solusi yang lebih baik untuk perintah semacam itu yang dapat diakses melalui jalur yang kompleks, saya akan sangat senang mendengarnya.
Gilles
sumber
CALL
. UNTUK / F tidak berfungsi jika path memiliki spasiCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
> berfungsi dengan baik.Anda dapat menangkap semua output dalam satu variabel, tetapi garis-garis akan dipisahkan oleh karakter pilihan Anda (# dalam contoh di bawah), bukan CR-LF yang sebenarnya.
Versi kedua, jika Anda perlu mencetak isinya baris demi baris. Ini mengambil keuntungan dari kenyataan bahwa tidak akan ada garis duplikat output dari "dir / b", jadi mungkin tidak berfungsi dalam kasus umum.
sumber
hasilnya adalah 'TXT: hola'
sumber
Anda harus menggunakan
for
perintah, berikut ini sebuah contoh:dan Anda dapat menggunakan
call :output "Command goes here"
maka output akan berada dalam%output%
variabel.Catatan: Jika Anda memiliki output perintah multiline, alat ini akan
set
menampilkan output ke baris terakhir dari perintah multiline Anda.sumber
Silakan merujuk ke http://technet.microsoft.com/en-us/library/bb490982.aspx ini yang menjelaskan apa yang dapat Anda lakukan dengan output perintah.
sumber
git pull>0 set /P RESULTVAR=<0
edit: Saya kira, saya tidak tahu bagaimana menggunakan jeda baris di sini ... setiap perintah pada baris itu sendiri.