web-dev-qa-db-ja.com

Windowsコマンドプロンプト:コマンドの出力を環境変数に取得するにはどうすればよいですか?

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

私の目標は、いくつかのバックアップスクリプトのバッチファイルで変数を使用することです。

60
Tim

あなたは次のようなものを使うことができます:

$env:DOW = "foo"
89
Ion Todirel

PowerShellは環境変数を操作する以上の能力があるため、PowerShellで両方のコマンドを実行する必要があります。

つまり:

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

または

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

ちなみに、得られるのはPowerShellの戻りコードであり、生成するデータではないため、スクリプトは機能しません。それを機能させる方法はあるかもしれませんが、適切なPowerShellスクリプトを使用するだけに比べると、最終的には無意味です。

完全を期すために、PowerShellと環境変数に関するMicrosoftの素晴らしい記事を以下に示します。

環境変数の作成と変更

更新:チャットで@ syneticon-djを使用してこのソリューションを確認したところ、この方法を使用して直面している問題は、コマンドプロンプトを再ロードする必要があることです外部で起こった環境変数の変化を反映する前に。

あなたはそれが何をしているのかについて多くの詳細を提供していませんが、これがPowerShellを起動する唯一の理由である場合、私の実際の提案は、あなたが物事をどのようにしているかを確認することです。

PowerShellを使用してプロセス全体を実行するか、代わりにスケジュールされたタスクの使用を検討しましたか?曜日に基づいてタスクをスケジュールできます。

22
Dan

一時的な「プロセス」コンテキストを選択した場合、またはそれを持たない場合、PowerShellの終了時に変数のコンテンツがPowerShellの終了時に失われるため、Danの提案に従って[Environment]::SetEnvironmentVariableを使用してPowerShell内から環境変数を設定しても意味がないと思います。バッチファイルの環境まだ永続的な「マシン」または「ユーザー」コンテキストを選択した場合-つまり、スクリプト全体が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>
20
the-wabbit

それが私であり、親スクリプトhasがシェルスクリプトである場合、次のように.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コマンドレット)を確認する必要がある場合があります。

4
Simon Catlin

または、古いシェルでこれを行うことに慣れている場合は、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
3
M Jeremy Carter

バッチファイルから、PowerShellコマンドによって設定された環境変数にアクセスする場合は、次の回避策を使用できます。

PowerShellスクリプトで「set variable = value」行を含むサブバッチファイルmysub.batを作成し、PowerShellコマンドの直後にメインバッチファイルからそのmysub.batバッチファイルを実行します。

デフォルトのPowerShell出力メソッドではなくWriteAllLinesメソッドを使用して、サブバッチファイルがUTF-8エンコード形式で生成されないようにします。

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
1
user262456

実際、以下のようなものを.ps1ファイルに入れ(たとえば、t.ps1)、PowerShell -File t.ps1を使用してCMDセッションからそれを呼び出すと、うまく機能します。

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

ただし、t.ps1スクリプトが呼び出されたCMDセッションでは使用できません。新しいCMDセッションでは、次のようになります。

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

CMDセッションでexport T=dateのようなものを実行する方法を見つける必要があると思います。

1
Edgar