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
내 목표는 일부 백업 스크립트를 위해 배치 파일에 변수를 사용하는 것입니다.
답변
다음과 같은 것을 사용할 수 있습니다.
$env:DOW = "foo"
답변
PowerShell은 환경 변수를 조작 할 수있는 기능 이상이므로 PowerShell에서 두 명령을 모두 실행해야합니다.
즉 :
$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")
또는
[Environment]::SetEnvironmentVariable("DOW", $dow, "User")
그건 그렇고, 스크립트가 작동하지 않습니다. 왜냐하면 얻는 모든 데이터가 아니라 PowerShell 반환 코드이기 때문입니다. 작동시키는 방법이있을 수 있지만 적절한 PowerShell 스크립트를 사용하는 것과 비교할 때 궁극적으로 의미가 없습니다.
완전성을 위해 다음은 PowerShell 및 환경 변수에 대한 Microsoft의 훌륭한 기사입니다.
업데이트 : 채팅에서 @ syneticon-dj를 사용 하여이 솔루션을 검토 한 결과이 방법을 사용하면 외부에서 발생한 환경 변수의 변경 사항을 반영하기 전에 명령 프롬프트를 다시로드해야한다는 문제가 나타납니다.
현재 수행중인 작업에 대한 자세한 정보는 제공하지 않았지만 이것이 PowerShell을 시작한 유일한 이유라면 실제 제안이 작업 수행 방식을 검토하는 것보다 더 중요합니다.
PowerShell을 사용하여 전체 프로세스를 수행합니까, 아니면 예약 된 작업을 사용하려고하십니까? 요일을 기준으로 작업을 예약 할 수 있습니다.
답변
[Environment]::SetEnvironmentVariable
Dan이 제안한대로 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>
답변
그것이 나와 부모 스크립트 가 쉘 스크립트 여야한다면 .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)을 확인해야 할 수도 있습니다.
답변
또는 이전 셸에서이 작업을 수행 한 경우 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
답변
실제로 아래와 같은 것을 .ps1 파일 (예 :)에 넣고 t.ps1
PowerShell을 사용하여 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=date
CMD 세션 과 같은 작업을 수행하는 방법을 찾아야한다고 생각 합니다.
답변
배치 파일이 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