Prompt perintah Windows: bagaimana cara mendapatkan output dari perintah ke dalam variabel lingkungan?

59

Saya ingin memiliki variabel lingkungan yang berisi hari dalam seminggu di cmd.exe.

Ketika saya menjalankan perintah ini, saya mendapatkan hasil yang saya inginkan.

C:\Users\tisc> powershell (get-date).dayofweek
Friday

Di sini saya mencoba menyimpan hasilnya dalam variabel lingkungan.

C:\Users\tisc> set dow = powershell (get-date).dayofweek

Tetapi ketika saya mencoba untuk mendapatkannya saya tidak mendapatkan tali seperti yang saya inginkan.

C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek

Tujuan saya adalah menggunakan variabel dalam file batch untuk beberapa skrip cadangan.

Tim
sumber

Jawaban:

87

Anda dapat menggunakan sesuatu seperti:

$env:DOW = "foo"
Ion Todirel
sumber
3
Saya tidak mengerti mengapa ini ditandai secara negatif, apakah Anda tahu lebih baik untuk mengatur variabel lingkungan?
Ion Todirel
2
+1 Ini berfungsi baik untuk saya dalam skenario yang saya butuhkan. PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
David Ruhmann
14
@IonTodirel Karena ini hanya bertahan di ruang proses.
JohnD
akhirnya saya sekarang mengerti bagaimana cara mengatur RAILS_ENV di PowerShell
wired00
Lalu bagaimana Anda menampilkannya untuk memastikan itu berfungsi?
CodyBugstein
22

Anda harus menjalankan kedua perintah di PowerShell karena PowerShell lebih dari mampu memanipulasi variabel lingkungan.

Yaitu:

$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")

atau

[Environment]::SetEnvironmentVariable("DOW", $dow, "User")

Omong-omong, skrip Anda tidak berfungsi karena semua yang Anda dapatkan adalah kode pengembalian PowerShell, bukan data yang dihasilkannya. Mungkin ada cara untuk membuatnya bekerja, tetapi pada akhirnya tidak ada gunanya dibandingkan dengan hanya menggunakan skrip PowerShell yang tepat.

Untuk kelengkapan, berikut adalah artikel bagus dari Microsoft tentang PowerShell dan variabel lingkungan:

Membuat dan Memodifikasi Variabel Lingkungan

Pembaruan: Setelah meninjau solusi ini dengan @ syneticon-dj dalam obrolan, tampaknya masalah yang Anda hadapi menggunakan metode ini adalah bahwa prompt perintah harus dimuat ulang sebelum akan mencerminkan perubahan dalam variabel lingkungan yang telah terjadi secara eksternal.

Anda belum memberikan banyak detail tentang apa yang Anda lakukan, tetapi jika ini adalah satu-satunya alasan Anda meluncurkan PowerShell, daripada saran saya yang sebenarnya adalah untuk meninjau bagaimana Anda melakukan sesuatu.

Apakah seluruh proses Anda menggunakan PowerShell atau sudahkah Anda mempertimbangkan untuk menggunakan tugas terjadwal? Anda dapat menjadwalkan tugas berdasarkan pada hari dalam seminggu.

Dan
sumber
File batch akan dijalankan setiap hari dan dijalankan dari tugas yang dijadwalkan. Saya berpikir untuk bekerja di PowerShell sebagai gantinya. Tapi aku bahkan lebih banyak pemula di PowerShell dari cmd. Dan sekarang saya mengalami kesulitan dengan perintah sederhana. Tapi saya bisa membuat pertanyaan baru tentang itu, mungkin itu yang mudah untuk Anda :) EDIT: Saya sudah menemukan jawabannya. Itu cara menjalankan program dengan beberapa parameter.
Tim
Saya juga tidak hebat di PowerShell, tapi itu layak untuk dipelajari. Sebagai permulaan, ini lebih baik dalam hampir semua hal, tetapi juga cara Microsoft (dan juga produsen lain) bergerak.
Dan
1
Juga, perhatikan bahwa saran @ Dan di atas menetapkan variabel lingkungan secara cukup permanen (baik dalam konteks Mesin atau Pengguna). Jika Anda mengabaikan parameter ketiga, Anda dapat mengaturnya hanya untuk proses saat ini, yang kadang-kadang lebih diinginkan.
Per Lundberg
20

Saya percaya pengaturan variabel lingkungan dari dalam PowerShell dengan [Environment]::SetEnvironmentVariableseperti yang disarankan oleh Dan tidak ada gunanya, karena Anda akan kehilangan konten variabel saat penghentian PowerShell jika Anda memilih konteks "proses" sementara atau tidak akan memilikinya dalam lingkungan file batch Anda belum jika Anda memilih konteks "mesin" atau "pengguna" permanen - yaitu, kecuali seluruh skrip Anda ditulis dalam PowerShell, di mana masalahnya tidak akan muncul di tempat pertama:

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser> powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS C:\Users\myuser> $dow = (get-date).dayofweek
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "User")
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "Process")
PS C:\Users\myuser> exit

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser>

Anda bisa menggunakan forperintah sebagai solusi untuk mengurai output perintah PowerShell Anda dan memasukkannya ke dalam variabel:

  for /F "usebackq tokens=1" %%i in (`powershell ^(get-date^).dayofweek`) do set DOW=%%i

Perhatikan karakter tanda sisipan yang ^digunakan untuk menghindari karakter khusus kurung dalam panggilan PowerShell Anda.

Jika Anda mengujinya dari baris perintah dan bukan dari dalam konteks file batch, Anda perlu mengganti %%referensi variabel sebelumnya dengan %:

C:\Users\myuser> for /F "usebackq tokens=1" %i in (`powershell ^(get-date^).dayofw
eek`) do set DOW=%i

C:\Users\myuser> set DOW=Friday

C:\Users\myuser>
the-wabbit
sumber
Tidak, ini salah. Contoh saya di bawah ini menetapkan variabel lingkungan 'normal' yang dapat diakses dari file batch dll.
Dan
@Dan Saya percaya Anda salah, saya sudah mencoba pengaturan [Environment]::SetEnvironmentVariable("DOW", $dow, "user")dari dalam sesi menjalankan powershell tapi itu tidak ada di sesi cmd orang tua saya setelah penghentian PowerShell
the-wabbit
Pemformatan telah mengacaukannya, tetapi Anda belum menetapkan $ dow. Menjalankan contoh saya dalam skrip Powershell menyimpan variabel lingkungan normal seperti yang diharapkan.
Dan
1
@Dan BTW: Saya tidak keberatan dengan downvoting, tetapi harus dicatat bahwa pendekatan yang ditunjukkan jelas melakukan apa yang diminta penanya , jadi bahkan jika ada pendekatan yang lebih elegan, itu masih akan menjadi solusi yang valid untuk masalah tersebut.
the-wabbit
1
@ the-wabbit Kedengarannya seperti perilaku normal di Windows. Bahkan jika Anda memperbarui variabel lingkungan global, hanya proses yang dimulai sejak pembaruan akan mengenali perubahan. Karena Anda berbicara tentang proses induk , itu pasti sudah dimulai sebelum perubahan. Hal yang sama terjadi dengan SETdi Command Prompt. Coba mulai anak cmd.exedan Anda akan melihat hal yang sama. Perilaku yang Anda lihat di PowerShell adalah karena memperbarui variabel lingkungan melalui kelas .NET tidak memengaruhi proses saat ini.
jpmc26
4

Jika itu aku, dan script orang tua memiliki menjadi shell script, aku hanya melakukan doa nakal dari PowerShell dalam naskah cmd seperti:

set DOW=
for /f %%D in ('%SystemRoot%\System32\WindowsPowerShell\V1.0\powershell.exe -NoLogo -NoProfile -Command Write-Host -Object ^(Get-Date^).DayOfWeek;') do set DOW=%%D

Anda mungkin perlu memeriksa kebijakan eksekusi PowerShell Anda (cmdlet Set-ExecutionPolicy).

Simon Catlin
sumber
3

Atau jika Anda menikah untuk melakukan ini di shell lama, lewati PowerShell sepenuhnya.

Gunakan variabel% date% dan rentangkan hari dari singkatan yang diberikannya (ini mungkin dipengaruhi oleh pengaturan format tanggal regional):

C:\> echo %date%
Thu 09/05/2013

Raih token pertama dalam jawabannya dan perluas itu:

C:\> type dayofweek.cmd
@echo off
for /f %%A in ("%date%") do set DAYOFWEEK=%%A
if "%DAYOFWEEK%" == "Mon" set DAYOFWEEK=Monday
if "%DAYOFWEEK%" == "Tue" set DAYOFWEEK=Tuesday
if "%DAYOFWEEK%" == "Wed" set DAYOFWEEK=Wednesday
if "%DAYOFWEEK%" == "Thu" set DAYOFWEEK=Thursday
if "%DAYOFWEEK%" == "Fri" set DAYOFWEEK=Friday
if "%DAYOFWEEK%" == "Sat" set DAYOFWEEK=Saturday
if "%DAYOFWEEK%" == "Sun" set DAYOFWEEK=Sunday
echo.%DAYOFWEEK%
C:\>
C:\> dayofweek
Thursday
M Jeremy Carter
sumber
1
Windows 10 tidak akan menampilkan DOW dalam% DATE%: H: \> echo% date% 20/03/2019
Raúl Salinas-Monteagudo
1

Sebenarnya, ketika meletakkan sesuatu seperti di bawah ini dalam file .ps1 (katakanlah, t.ps1) dan memanggilnya dari sesi CMD dengan PowerShell -File t.ps1... itu berfungsi dengan baik.

$DateAndTime = (get-date -UFormat "%Y%m%d_%H%M%S")[Environment]::SetEnvironmentVariable("DateAndTime", $DateAndTime, "Machine")

Tapi tidak untuk sesi CMD tempat skrip t.ps1 dipanggil. Dalam sesi CMD baru kita dapatkan:

D:> echo% DateAndTime% ==> 20120208_123106

Saya kira kita harus mencari tahu bagaimana melakukan sesuatu seperti export T=datedalam sesi CMD.

Edgar
sumber
1

Jika Anda ingin file batch Anda mengakses variabel lingkungan yang ditetapkan oleh perintah PowerShell yang dijalankan dari file batch itu, Anda bisa menggunakan solusi berikut ini:

Buat skrip PowerShell Anda membuat file sub batch mysub.bat,, yang berisi baris "set variable = value", dan jalankan file batch mysub.bat dari file batch utama tepat setelah perintah PowerShell.

Gunakan metode WriteAllLines daripada metode output PowerShell default sehingga file sub batch tidak dihasilkan dengan format pengkodean UTF-8.

Contoh

main.bat:

REM main.bat first line
powershell -Command "[System.IO.File]::WriteAllLines(\".\mysub.bat\", \"set VARIABLE=VALUE\");"
.\mysub.bat
echo VARIABLE=%VARIABLE%
REM expected output: VARIABLE=VALUE
pengguna262456
sumber