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
なぜこれが否定的にフラグ付けされたのかわかりませんが、環境変数を設定する方が良いことを知っていますか?
イオントディレル

2
+1これは、私が必要とするシナリオで私に最適です。PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
デビッドルーマン

14
@IonTodirelこれはプロセス空間でのみ持続するためです。
JohnD 14年

最終的に私は今、PowerShellでHOWTO設定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の初心者です。そして今、私は単純なコマンドで問題を抱えています。しかし、私はその質問について新しい質問をすることができます。多分それはあなたにとって簡単な質問でしょう:)編集:私はそれを理解しました。いくつかのパラメーターを使用してプログラムを実行する方法でした。
ティム

PowerShellも得意ではありませんが、学ぶ価値は十分にあります。最初はほぼすべての点で優れていますが、Microsoft(および他のメーカー)の動向でもあります。
ダン

1
また、上記の@Danの提案は、環境変数を(マシンまたはユーザーコンテキストのいずれかで)非常に永続的に設定することに注意してください。3番目のパラメーターを省略した場合、現在のプロセスだけに設定できますが、これが望ましい場合があります。
ルンドバーグあたり

20

[Environment]::SetEnvironmentVariableDanが提案したようにPowerShellから環境変数を設定することは無意味だと思います。一時的な「プロセス」コンテキストを選択した場合、またはバッチファイルの環境内にまだない場合、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呼び出し内の括弧の特殊文字をエスケープするために使用されるキャレット文字に注意してください。

バッチファイルコンテキスト内ではなく、コマンドラインからテストする場合は、%%before変数の参照を%次のように置き換える必要があります。

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、私が設定しようとした[Environment]::SetEnvironmentVariable("DOW", $dow, "user")実行中のPowerShellセッション内から、それはPowerShellの終了時に、私の親CMDセッション中に存在していなかった
-wabbit

書式設定はそれを台無しにしましたが、$ dowを定義していません。Powershellスクリプトで私の例を実行すると、通常の環境変数が期待どおりに保存されます。
ダン

1
@Dan BTW:ダウン投票は気にしませんが、実証されたアプローチは質問者が求めていることを明確に実行するため、よりエレガントなアプローチがあったとしても、それは問題の有効な解決策であることに注意してください。
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コマンドレット)を確認する必要がある場合があります。


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:\>エコー%日付%20/03/2019
ラウル・サリナス- Monteagudo

1

実際、以下のようなものを.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:> echo%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.