中小企業の働き方改革をサポート>>

PowerShelにおいて外部ファイルに書いてある変数を設定したと考えています。

たとえばread.iniファイルに下記の記載があるとします。
[yomikomi]
FilePath,C:\temp\test
MODRI,3
Message,"エラーが起きました"

このファイルをps1ファイルで読み込んで変数にしたい感じです。
$FilePath=C:\temp\testといった感じ)
区切り文字とかは何でもいいです。

読み込ませ形式についてはiniかps1形式が理想です。

ただ実行ps1ごとに読み込ませるファイルが異なるため.profileなどの初期読みこみ
系にかけない状況です。(profileがもっと応用的に使用できるならいいですが)

よろしくお願いします。

A 回答 (2件)

丁度同じような話が出ました。


http://okwave.jp/qa/q6899282.html

ポイントの部分だけ抜き出したものを載せておきます。
不要行の読み飛ばしや配列利用は、適宜応用してみて下さい。


*** 以下の2ファイルを同ディレクトリに配置し、script.ps1を実行する ***

*** script.ps1 ***
Get-Content .\read.ini | Foreach-Object {
$name, $value = $_.split(',', 2)
Invoke-Expression "`$$name='$value'"
}

echo $FilePath $MODRI $Message

*** read.ini ***
FilePath,C:\temp\test
MODRI,3
Message,"エラーが起きました"
    • good
    • 0

Get-Contentとか。


それと、設定ファイルはXML形式にするのが簡単。
「PowerShellでの外部ファイルから」の回答画像1
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

推奨いただきましたXML形式についてはXMLを勉強しつつ取り入れていきたいと思います。

それともう一つのGet-Content形式ですが、これは読み込んだ後どのように変数化すればいいでしょうか?
今はiniファイルの中身を
[Sting]$test0="message001"
[Sting]$test2="message002"
[Sting]$test3="message003"

みたいな形にして、います。

前に以下のような形で適用できないか試しましたが・・・

$reader = New-Object System.IO.StreamReader($Logfile,[Text.Encoding]::GetEncoding("Shift_Jis"))

while (($line = $reader.ReadLine()) -ne $null){

# 抜き出し処理
$check1=$line -split ","

if($rx.IsMatch($line)){
# "先頭が#の場合Skip"
}elseif($line -eq ""){
# "文字が含まれていない場合Skip"
}elseif($line.trim() -eq "" ){
# "全空白を削除した結果Nullの場合Skip"
}else{
if($check1[1] -ne ""){
$check1[0]=$check1[1] →ここにで読み込んだものを変数格納する形がわからない
}
}
}

ご教授ください。

お礼日時:2011/07/24 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPowerShellからPowerShellを呼び出す方法

PowerShellからPowerShellを呼び出す方法

次のバッチファイルと同等の事をPowerShellで行う方法を教えて下さい。

下記のような非常に簡易的なバッチファイルがあるとします。

■ aaa.bat ■
echo test
■ aaa.bat ■


■ bbb.bat ■
aaa.bat > aaa.log
■ bbb.bat ■


■ コマンドプロンプト ■
cmd> aaa.bat ・・・ 下に「test」と出力される
test
cmd> bbb.bat ・・・ ファイルaaa.logに「test」と出力される
■ コマンドプロンプト ■



同じ事をPowerShellでするとすれば

■ aaa.ps1 ■
echo "test"
■ aaa.ps1 ■


■ PowerShellの画面から ■
PS > ./aaa.ps1 ・・・ 下に「test」と出力される
test
PS > ./bbb.ps1 ・・・ ファイルaaa.logに「test」と出力される
■ PowerShellの画面から ■

この時の「bbb.ps1」はどのようになりますか?

PowerShellからPowerShellを呼び出す方法

次のバッチファイルと同等の事をPowerShellで行う方法を教えて下さい。

下記のような非常に簡易的なバッチファイルがあるとします。

■ aaa.bat ■
echo test
■ aaa.bat ■


■ bbb.bat ■
aaa.bat > aaa.log
■ bbb.bat ■


■ コマンドプロンプト ■
cmd> aaa.bat ・・・ 下に「test」と出力される
test
cmd> bbb.bat ・・・ ファイルaaa.logに「test」と出力される
■ コマンドプロンプト ■



同じ事をPowerShellでするとすれば

■ aaa.ps1 ■
echo "test"
■ aaa.ps1 ■


■ ...続きを読む

Aベストアンサー

回答番号:No.1 お礼へのアドバイスです。

>「キックして結果を待は待たずに次の処理をする」
>などのバリエーションは可能でしょうか?

使いこなせていませんがPowerShell 2.0ではバックグラウンドジョブが実現されました。下記の@ITの記事などが参考になると思います。

http://www.atmarkit.co.jp/fwin2k/winsv2008r2/03powershell/03powershell_03.html

Windows7で Start-Job, Get-Job, Receive-Jobが働くことを確認しました。

QPowerShellでのエラー出力の読み捨て

PowerShellでスクリプトを書いています。そこで、かならずメッセージが表示される処理があります。無視してかまわない内容なので、bash等の 2> /dev/null に相当するような「読み捨て」を行いたいのですが、PowerShell でのやり方がわかりません。ご存知の方、教えてください。

Aベストアンサー

2>Out-Null

参考URL:http://www.google.co.jp/search?hl=ja&q=powershell+redirect+error+null&lr=lang_ja

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

QPowerShellにおけるコマンドの戻り値につい

はじめまして質問させていただきます。

最近PowrShellを書き始めました

そこでですが、PowrShellにおいてBatならERRORLEVEL、Shellなら$?といったコマンドの実行結果コードをとる方法がありますしょうか?

PowerShelでも$?は使用できますが、True/Falseだけなので生後判定が2種類しかないので・・

Aベストアンサー

$LastExitCodeとか。
例外と使い分ける必要があります。

参考URL:http://technet.microsoft.com/ja-jp/library/bb978525.aspx

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

QPowershell プロセス二重起動

PowerShell初心者です。
自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。

現在コマンドラインで確認しているのですがどうもうまくいきません。
やろうとしている操作は以下です。

(1)ファイルにプロセス情報を出力。
PS C:\> $tempfile = "C:\pswork\servicemon\temp.log"

PS C:\> Get-WmiObject win32_process `
| select Name,
ProcessId,
CommandLine `
| sort Name `
| Format-Table -AutoSize `
| Out-File -FilePath $tempfile -width 1000

(2)自分のPID以外のプロセス情報を取得

PS C:\> $mypid = $PID

PS C:\> $killpidtmp = Get-Content $tempfile | Select-String -Pattern ".*powershell.exe.*svmon131_loop.*" |Select-String -NotMatch -Pattern "\s$mypid\s"

PS C:\> echo $killpidtmp

powershell.exe 2024 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command C:\pswork\servicemon\svmon131_loop.ps1



(3)splitでプロセス番号のみを取得。
PS C:\> $killpid = echo $killpidtmp |% {$($_-split(" "))[1]}

PS C:\> echo $killpid

★ここがうまく取得できません。空白しか取得できていません。

(4)最終的には取得したPIDでプロセスを終了。
PS C:\pswork\servicemon> Stop-Process -ID $killpid

Bシェルで同様のスクリプトがあったので、それを参考にPowerShellで書こうとしているので、
そもそも無理があるのかもしれないかと考えています。
上記の方法でなくてもよいので、二重起動のチェックと該当プロセスの停止で参考となる情報があれば教えて頂きたいです。

PowerShell初心者です。
自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。

現在コマンドラインで確認しているのですがどうもうまくいきません。
やろうとしている操作は以下です。

(1)ファイルにプロセス情報を出力。
PS C:\> $tempfile = "C:\pswork\servicemon\temp.log"

PS C:\> Get-WmiObject win32_process `
| select Name,
ProcessId,
CommandLine `
| sort Name `
...続きを読む

Aベストアンサー

Get-WmiObject win32_process |
Where {$_.Name -eq "powershell.exe" -and $_.CommandLine -match "svmon131_loop" -and $_.ProcessId -ne $PID} |
ForEach {Stop-Process -ID $_.ProcessId}
という感じでどうでしょう?

(1)すべてのプロセスを列挙
(2)(1)のうち、「Name="powershell.exe" AND CommandLineが正規表現"svmon131_loop"にマッチ AND ProcessIdが自分以外」を満たすプロセスを抽出
(3)(2)で抽出したプロセスに対して、各々Stop-Processを実行

QPowerShellの「$変数=@"文字列”@」の意味がわかりません。

function RunningVMs{
$desc = @"
This specified VM is already runnning.
Please specified other strings.
Running VMs :
$RunVM
"@

参考URL
http://qiita.com/ine1127/items/8a01cbf4558733afc9cf

$dsec=@"文字列”@

Aベストアンサー

http://ufcpp.net/study/powershell/string.html

Qpowershellでコンソール表示をテキスト保存

powershellでコンソールに表示された結果を
保存するにはどうしたらよいでしょうか?
保存してもコンソール表示はしたいので、
リダイレクトは無しでお願いしたいと思います。

Aベストアンサー

リダイレクトは無し というのは、
PS C:\Users\User1\ps> 1,2 >log.txt;get-content log.txt
1
2
ではだめだということでしょうか。
つまり、リアルタイムで表示したうえで記録も残しておきたい、と。

そうであればおそらく最初に候補とすべきはTee-Objectでしょうか。
PS C:\Users\User1\ps> 1,2 | tee-object log.txt
1
2
この例では違いはわかりませんがリアルタイムで表示しているはずです。
なお、ファイルの代わりに変数に保存することもできます(引数 -Variable に文字列で指定)

あとはStart-Transcriptでセッションの記録を開始してStop-Transcriptで記録終了する方法もあるようです。

(余談ですが、参考URLの「Tee-Objectにはファイルの追加モードが無い」というのはPowerShell 2.0までの話のようです)

参考URL:http://mtgpowershell.blogspot.jp/2011/12/tee-object.html

リダイレクトは無し というのは、
PS C:\Users\User1\ps> 1,2 >log.txt;get-content log.txt
1
2
ではだめだということでしょうか。
つまり、リアルタイムで表示したうえで記録も残しておきたい、と。

そうであればおそらく最初に候補とすべきはTee-Objectでしょうか。
PS C:\Users\User1\ps> 1,2 | tee-object log.txt
1
2
この例では違いはわかりませんがリアルタイムで表示しているはずです。
なお、ファイルの代わりに変数に保存することもできます(引数 -Variable に文字列で指定)

あとはStart-Transcri...続きを読む

QDirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)

いろいろ調べましたが不明な点があり、質問します。

WindowsのDOSプロンプトでdirコマンドを打つとフォルダ・ファイルの一覧が表示されますが、その中にファイルサイズが表示されています。
このサイズを合計できるコマンドはありませんか?
DIRコマンドのオプションを調べましたがそれらしいものが見当たりません。
具体的には
C:\xxx\配下に50個程度のファイルがあります。
その50個の合計サイズを知りたいです。
xxxフォルダの親フォルダにはアクセス不可です。

ずーっと悩んでいます。よろしくお願いします。

なお、OSはWindowsNTか2000で使用予定です。

Aベストアンサー

カレントドライブ、カレントフォルダを
C:\xxx\
にした状態で、

dir /s /a-d

/sパラメータででサブディレクトリすべてを検索
/a-dパラメータでディレクトリ以外のファイル(つまり属性に関係なくすべてのファイル

これを実行すると最後にファイルの個数とファイルサイズの合計を表示します。

もし、隠し属性のファイルは合計しないのであれば、

dir /s

だけで良いと思われます。

Qバッチファイルでサーバーのファイルをクライアントへコピーしたい

サーバーに保存されているファイルを、
クライアントのCドライブへコピーしたい。

各クライアントにバッチファイルを配布して、
それを実行するだけでコピーされるようにしたいのです。

初心者で申し訳ないのですが、何卒よろしくお願いします。
------------------------

下記の記述ですと、普通にサーバーのCドライブへファイルがコピーされます。
しかし、コピー先はバッチファイルを実行したクライアントのローカルディレクトリにしたいのです。

copy \\サーバー名\フォルダ名\ファイル名 C:\

Aベストアンサー

>下記の記述ですと、普通にサーバーのCドライブへファイルがコピーされます。

そんなはずはありません。何かの勘違いでしょう。

>copy \\サーバー名\フォルダ名\ファイル名 C:\

だと、バッチファイルを実行したPCのC:\にコピーされます。

copy \\サーバー名\フォルダ名\ファイル名 C:
と、最後の \ を削れば、バッチファイルがあるのと同じディレクトリにコピーされます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報