Windows 명령 프롬프트 : 명령의 출력을 환경 변수로 가져 오려면 어떻게합니까?


59

cmd.exe에 요일이 포함 된 환경 변수를 갖고 싶습니다.

이 명령을 실행하면 원하는 결과를 얻습니다.

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

여기서 결과를 환경 변수에 저장하려고합니다.

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

그러나 그것을 얻으려고하면 원하는대로 문자열을 얻지 못합니다.

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

내 목표는 일부 백업 스크립트를 위해 배치 파일에 변수를 사용하는 것입니다.

답변:


87

다음과 같은 것을 사용할 수 있습니다.

$env:DOW = "foo"

3
왜 이것이 부정적인 것으로 플래그 지정되었는지 이해하지 못합니다. 환경 변수를 설정하는 것이 더 낫다는 것을 알고 있습니까?
Ion Todirel

2
+1 이것은 필요한 시나리오에서 나에게 효과적입니다. PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
David Ruhmann

14
@IonTodirel 이것은 프로세스 공간에서만 지속되기 때문입니다.
JohnD 2016 년

마지막으로 powershell에서 RAILS_ENV를 설정하는 방법을 이해했습니다
wired00

그런 다음 어떻게 작동하는지 확인하려면 어떻게 출력합니까?
CodyBugstein

22

PowerShell은 환경 변수를 조작 할 수있는 기능 이상이므로 PowerShell에서 두 명령을 모두 실행해야합니다.

즉 :

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

또는

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

그건 그렇고, 스크립트가 작동하지 않습니다. 왜냐하면 얻는 모든 데이터가 아니라 PowerShell 반환 코드이기 때문입니다. 작동시키는 방법이있을 수 있지만 적절한 PowerShell 스크립트를 사용하는 것과 비교할 때 궁극적으로 의미가 없습니다.

완전성을 위해 다음은 PowerShell 및 환경 변수에 대한 Microsoft의 훌륭한 기사입니다.

환경 변수 생성 및 수정

업데이트 : 채팅에서 @ syneticon-dj를 사용 하여이 솔루션을 검토 한 결과이 방법을 사용하면 외부에서 발생한 환경 변수의 변경 사항을 반영하기 전에 명령 프롬프트를 다시로드해야한다는 문제가 나타납니다.

현재 수행중인 작업에 대한 자세한 정보는 제공하지 않았지만 이것이 PowerShell을 시작한 유일한 이유라면 실제 제안이 작업 수행 방식을 검토하는 것보다 더 중요합니다.

PowerShell을 사용하여 전체 프로세스를 수행합니까, 아니면 예약 된 작업을 사용하려고하십니까? 요일을 기준으로 작업을 예약 할 수 있습니다.


배치 파일은 매일 실행되며 예약 된 작업에서 실행됩니다. 대신 Powershell에서 일할 생각입니다. 그러나 cmd보다 powershell에서 훨씬 더 초보자입니다. 그리고 지금은 간단한 명령으로 어려움을 겪고 있습니다. 그러나 나는 그 질문에 대해 새로운 질문을 할 수 있습니다. 어쩌면 그것은 당신에게 쉬운 질문 일 것입니다 :) 편집 : 나는 그것을 알아 냈습니다. 일부 매개 변수를 사용하여 프로그램을 실행하는 방법이었습니다.
Tim

나는 PowerShell도 훌륭하지는 않지만 배울만 한 가치가 있습니다. 처음에는 거의 모든면에서 더 나아졌지 만 Microsoft (및 다른 제조업체)가 움직이는 방식이기도합니다.
Dan

1
또한 위의 @Dan 제안은 환경 변수를 기계 또는 사용자 컨텍스트에서 영구적으로 설정한다는 점에 유의하십시오. 세 번째 매개 변수를 생략하면 현재 프로세스에 대해서만 설정할 수 있습니다. 때로는 더 바람직합니다.
Per Lundberg

20

[Environment]::SetEnvironmentVariableDan이 제안한대로 PowerShell 내에서 환경 변수를 설정하는 것은 의미가 없다고 생각합니다. 임시 "프로세스"컨텍스트를 선택한 경우 PowerShell이 ​​종료되면 변수의 내용이 손실되거나 배치 파일 환경에 아직 포함 되어 있지 않기 때문입니다 . 영구 "machine"또는 "user"컨텍스트를 선택한 경우, 즉 전체 스크립트가 PowerShell로 작성되지 않은 경우 처음에는 문제가 발생하지 않습니다.

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>

for명령을 해결 방법으로 사용 하여 PowerShell 명령의 출력을 구문 분석하고 변수에 넣을 수 있습니다.

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

^PowerShell 호출에서 괄호 특수 문자를 이스케이프하는 데 사용되는 캐럿 문자를 참고하십시오 .

배치 파일 컨텍스트가 아닌 명령 행에서 테스트하는 경우 %%이전 변수 참조를 %다음과 같이 바꿔야합니다 .

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>

아니요, 잘못되었습니다. 아래 예제는 모든 배치 파일 등에서 액세스 할 수있는 '정상적인'환경 변수를 설정합니다.
Dan

@Dan 나는 당신이 잘못 생각, [Environment]::SetEnvironmentVariable("DOW", $dow, "user")실행중인 powershell 세션 내에서 설정 을 시도했지만 PowerShell 종료시 부모 cmd 세션에 존재하지 않았습니다
the-wabbit

서식이 틀렸지 만 $ dow를 정의하지 않았습니다. Powershell 스크립트에서 예제를 실행하면 정상적인 환경 변수가 예상대로 저장됩니다.
Dan

1
@ 댄 BTW : 나는 downvoting을 신경 쓰지 않지만, 입증 된 접근법 은 질문자가 요구 한 것을 명확하게 수행 하므로 더 우아한 접근법이 있더라도 여전히 문제에 대한 유효한 해결책이 될 것입니다.
the-wabbit

1
@ the-wabbit Windows에서 정상적인 동작 인 것 같습니다. 글로벌 환경 변수를 업데이트하더라도 업데이트 이후에 시작된 프로세스 만 변경 사항을 인식합니다. 상위 프로세스 에 대해 이야기하고 있으므로 변경 전에 시작해야합니다. SET명령 프롬프트에서도 마찬가지 입니다. 아이를 시작 cmd.exe하면 같은 것을 볼 수 있습니다. PowerShell 에서 보이는 동작 은 .NET 클래스를 통해 환경 변수를 업데이트해도 현재 프로세스에 영향을 미치지 않기 때문입니다.
jpmc26

4

그것이 나와 부모 스크립트 쉘 스크립트 여야한다면 .CMD 스크립트에서 PowerShell을 건방진 호출하면됩니다.

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

PowerShell 실행 정책 (Set-ExecutionPolicy cmdlet)을 확인해야 할 수도 있습니다.


3

또는 이전 셸에서이 작업을 수행 한 경우 PowerShell을 완전히 건너 뜁니다.

% date % 변수를 사용하고 약어에서 하루를 확장하십시오 (지역 날짜 형식 설정의 영향을받을 수 있음).

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

답변의 첫 번째 토큰을 잡고 확장하십시오.

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

1
Windows 10은 % DATE %에 DOW를 표시하지 않습니다. H : \> echo % date % 20/03/2019
Raúl Salinas-Monteagudo

1

실제로 아래와 같은 것을 .ps1 파일 (예 :)에 넣고 t.ps1PowerShell을 사용하여 CMD 세션에서 호출하면 -File t.ps1... 잘 작동합니다.

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

그러나 t.ps1 스크립트가 호출 된 CMD 세션에는 해당되지 않습니다. 새로운 CMD 세션에서 우리는 다음을 얻습니다.

D :> 에코 % DateAndTime % ==> 20120208_123106

export T=dateCMD 세션 과 같은 작업을 수행하는 방법을 찾아야한다고 생각 합니다.


1

배치 파일이 PowerShell 명령으로 설정된 환경 변수에 액세스하여 해당 배치 파일에서 실행하도록하려면 다음 해결 방법을 사용할 수 있습니다.

PowerShell 스크립트 mysub.bat가 "set variable = value"행을 포함 하는 하위 배치 파일을 작성 하고 PowerShell 명령 바로 다음에 기본 배치 파일에서 해당 mysub.bat 배치 파일을 실행하십시오.

하위 배치 파일이 UTF-8 인코딩 형식으로 생성되지 않도록 기본 PowerShell 출력 메소드 대신 WriteAllLines 메소드를 사용하십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.