Power Shellの変数について

このQ&Aのポイント
  • Power Shellを使用してiniファイルから変数を読み込み、robocopyの値に代入する方法が分からず困っています。どのようなプログラムを作成すれば良いのでしょうか?
  • Power Shellでiniファイルから変数を利用してrobocopyの値を設定する方法について教えてください。
  • Power Shellでiniファイルから変数を読み込み、robocopyの値に代入するプログラムを作成していますが、うまく動きません。解決策を教えてください。
回答を見る
  • ベストアンサー

power shell の変数について。

宜しくお願いします。 "power shellで、iniファイルを読み込み、それをrobocopyの値に代入する"プログラムを作成しています。 サイトや、サンプルコード等を参考にしながら、プログラムの作成に取り組んでいるのですが、 想定通りの動きをしてくれません。 以下が現時点のモジュール(.ps1と.ini)です。 #####【実行モジュール(robocopy.ps1)】##### if (!(test-path -pathtype Leaf D:\testmodule\test_ini.ps1)) { $MSG = (get-date -Format "yyyy/MM/dd HH:mm:ss.ff ") + ` "iniファイル無し" write-host $MSG exit 8 } else { . D:\testmodule\test_ini.ps1 } #ここでiniファイルの変数を、robocopyの値($***)に代入する処理を使用するのでしょうか? robocopy $FORDER $BK_FORDER $TXT $XLS /IS /MIR /COPYALL #####【定義ファイル(test.ini)】##### # 対象txt "testsystem.txt" # 対象xls "test.xls" # バックアップ元フォルダパス "M:\testforder" # バックアップ先フォルダパス "W:\bkupforder" 稼働内容としては、 【power shell実行 → iniファイルの読み込み → iniファイルから変数を使用し、robocopyの値($***)に代入し実行】 です。 特に、"iniファイルから変数を使用し、robocopyの値($***)に代入"する方法が分からず困っています。 iniで指定した変数をrobocopyの値に代入し、稼働内容通りに動かすには、 どのようなプログラムを作成すれば良いのでしょうか? お手数をかけますが、ご教授を宜しくお願いします。

noname#138172
noname#138172

質問者が選んだベストアンサー

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

evalみたいなことやれば、一応実現できるっぽいですね。 ただ、個人的にはあまり好きなやり方ではないです。 以下、=で区切るini形式で、パラメータ名をそのまま変数名にしています。 *** 以下の2ファイルを同ディレクトリに配置し、script.ps1を実行する *** *** script.ps1 *** if (test-path -pathtype Leaf .\settings.ini){ Get-Content .\settings.ini | Foreach-Object { $key, $value = $_.split('=', 2) Invoke-Expression "`$$key='$value'" } robocopy $FORDER $BK_FORDER $TXT $XLS /IS /MIR /COPYALL } else { write-host ((get-date -Format "yyyy/MM/dd HH:mm:ss.ff ") + "settings none.") exit 8 } *** settings.ini *** TXT=testsystem.txt XLS=test.xls BK_FORDER=M:\testforder FORDER=W:\bkupforder

noname#138172
質問者

お礼

sholmesさん 返事が遅くなりすみません。 ご教授して頂いたソースで、想定通りの稼働を確認しました。 Get-Content以外の各コマンド等についても、 少しずつ理解しながらプログラミングの知識を深めていきたいと思います。 また何かの機会でお世話になる事があるかもしれませんが、 その時はまた宜しくお願いします。 色々と丁寧なご指導ありがとうございました。

その他の回答 (1)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

iniでないと駄目でしょうか? 自分もあまり詳しくないので回避策がわからないのですが、普通に「.」で読み込ませる際は.ps1拡張子が必要に思えました。 尚且つ、外部ファイル側で変数代入文を書いておくという・・・ 急ぎということですので、とりあえずパラメータ渡す部分までうまくいくものを載せておきます。 *** 以下の2ファイルを同ディレクトリに配置し、script.ps1を実行する *** *** script.ps1 *** if (test-path -pathtype Leaf .\settings.ps1){ . .\settings.ps1 robocopy $FORDER $BK_FORDER $TXT $XLS /IS /MIR /COPYALL } else { write-host ((get-date -Format "yyyy/MM/dd HH:mm:ss.ff ") + "settings none.") exit 8 } *** settings.ps1 *** $TXT = 'testsystem.txt' $XLS = 'test.xls' $BK_FORDER = 'M:\testforder' $FORDER = 'W:\bkupforder' <おまけ> 変数名はそのまま残しましたが、運用へ入る前にforderはfolderへ変更した方が良いと思います。

noname#138172
質問者

お礼

sholmesさん 丁寧な回答ありがとうございます。 はい、出来ればiniファイルからの読み込みで、実行したいと思っています。 ですが、ps1から実行する方法もあるのですね。 どうしても出来なければ、こちらの方法も視野に入れて考えてみたいと思います。 スペルミスのご指摘もありがとうございます。

noname#138172
質問者

補足

Get-Contentコマンドによる方法で、iniファイルからの変数の指定は可能でしょうか?

関連するQ&A

  • shell 変数について

    お世話になっております。 たびたびすみません。 shellプログラミングで質問です。 以下のようなプログラムを作成したところ、 引数に2147483648以上の数値を与えて実行すると 変数に代入される値が-マイナスとなり、 おかしくなってしまいます。 シェル変数の上限は2147483647なのでしょうか? だとしたら、これ以上の数値を代入することはできないのでしょうか。 お手数ですが、よろしくお願いいたします。 #!bin/sh firstno=$1 echo "do you make a file?(y/n)" read ans if [ $ans = "y" ]; then sed -e 's/AAA/aaa/' aaa.csv >> aaaaaa.csv firstno=`expr $firstno + 1` echo "next no is \"$firstno\"" fi

  • 変数の扱いについて

    初めまして 仕事で簡単なシェルを作成していますが、ちょっと困っています。お分かりになる方がいらっしゃいましたら、お知恵をお貸しください。 外部ファイルとして変数を記述したファイルを作成しました。このファイルの内容を参照し、他で定義した変数を割り当てたいのですが、どうしても外部ファイルに記述した変数の文字を変数として認識してくれません。 書き方がおかしいのでしょうか? $ls MSG.sh MSG.txt ----- $cat MSG.txt Test $MSG1 ----- $cat MSG.sh #!/bin/sh MSG1=1 MSG=`cat MSG.txt` echo $MSG ----- $./MSG.sh $Test $MSG1 <--変数でなく文字として認識されてしまうう。 ---希望としてはこの様に表示して欲しい--- $Test 1 よろしくお願いします。

  • Shellでの環境変数

    Shell(親)ではShell(子)を呼び出しています。 Shell(子)では環境変数を設定しており、設定直後にechoすると設定した環境変数の内容が出力されます。 ですが、Shell(子)からShell(親)に戻った直後にShell(子)で設定した環境変数をechoすると、値が空になっています。 なんで空になるのかわかりません。 お手数かけますが、ご教授おねがいします。 <Shell(親)の内容> ./Shell(子) echo "TESTDIR(親):$TESTDIR" <Shell(子)の内容> TESTDIR=/dev/fs/test export TESTDIR echo "TESTDIR(子):$TESTDIR" <Shell(親)の実行結果> TESTDIR01:/dev/fs/test TESTDIR02: ←空白 ※環境 OS:Windows 2003 Server Shell:SUAのKorn Shell

  • Shellの使い方について

    VBを最近はじめたのですが、Shellがうまくいかず、困っています。 下記のような内容で、MS-DOS上で動作するプログラムをShellで呼び出していますが、ファイルが見つからないというエラーが出てしまいます。(<D:\kakasi\401.txt:No such file or directory) com1 = "kakasi.exe " + param + " <" + lbl_open_file + " > " + lbl_save_file retval = Shell(com1, vbNormalFocus) kakasi.exeには、パスが通してありますので、lbl_open_fileやlbl_save_fileのファイルが見つからないと思われます。 実行時のcom1の値は、kakasi.exe -Jk -Hk -Kk <D:\kakasi\401.txt > D:\kakasi\401.txt1 になっていて、DOSプロンプトから手入力、実行ではうまくいきます。 何が問題なのか分かる方、教えてください。 よろしくお願いします。

  • PowerShellでの外部ファイルからの変数読み

    PowerShelにおいて外部ファイルに書いてある変数を設定したと考えています。 たとえばread.iniファイルに下記の記載があるとします。 [yomikomi] FilePath,C:\temp\test MODRI,3 Message,"エラーが起きました" このファイルをps1ファイルで読み込んで変数にしたい感じです。 $FilePath=C:\temp\testといった感じ) 区切り文字とかは何でもいいです。 読み込ませ形式についてはiniかps1形式が理想です。 ただ実行ps1ごとに読み込ませるファイルが異なるため.profileなどの初期読みこみ 系にかけない状況です。(profileがもっと応用的に使用できるならいいですが) よろしくお願いします。

  • Shell関数内で変数を使うことについて

    お世話になります。 MicrosoftのサイトやAccessVBAのヘルプ、各種掲示板を拝見してもぴったりくるものが見つからなかったので教えていただきたく思います。 AccessVBAからExcelファイルを開きたいと思っています。 コマンドボタンウィザードを参考にして、 Call Shell("Excel.exe フルパス"vbMaximizedFocus)としました。 フルパスは変数を使用しております。 変数は2つの変数と&で結んだ文字列で構成されています。内容は以下の通りです。 MyCurrent & "\" & MyFile & ".xls" (MyFile = InputBox("保存したいファイル名を入力できます。", "ファイル名)、MyCurrent = Application.GetOption("Default Database Directory")を意味します。InputBoxでユーザーにファイル名を決定してもらい、既定のデータベースフォルダにそれを保存させます。) MyCurrentの中身は私のPCの場合はC:\Documents and Settings\●\デスクトップです(●=私の名前。スペースなし)。 ここで問題なのですが、Micorsoftのサイトによると、Shell関数内で半角スペースを含むフルパスやファイル名を記述すると、うまくいかないので"(ダブルコーテーション)を入力する必要があるとありました。 変数ではなく、普通にフルパスを入力する際には"を記述してファイルを開くことができたのですが、変数の場合それをどのようにしたら良いのかわからないのです。 変数そのものには半角スペースがなくても、変数の中身に半角スペースが存在する場合はその半角スペースをどのように回避したらよいのでしょうか? もしかして、変数の中身にあった場合は駄目なのでしょうか? 長文で申し訳ありませんが、よろしくお願いいたします。

  • [ExcelVBA] Module1で定義した変数の(代入した)値を、Module2でも使う方法

    基本中の基本のことで誠に申し訳ございません。 ある標準Moduleで宣言した変数に値を代入します。 その後、別のModuleでその変数を使用しますが、 その変数の中の値が消えてしまいます。 たとえば下記のように、プログラムを書きます。 test1を実行すると、続いてtest2も実行されます。 この場合、変数の値が0になってしまいます。 このような場合どうやったらいいのでしょうか? Hensuu1の値をセルに一度出力させて、 別のModuleで、セルの値をもう一度変数に代入させて使用する という方法で何とかしていたのですが、大変で困っています。 Module1に記載------------ dim Hensuu1 as integer sub test1() Hensuu1 = 100 test2 end sub ------------------------- Module2に記載------------- sub test2 range("A1") = Hensuu1 end sub --------------------------

  • VBAのShellの同期的実行

    ExcelVBAについての質問です。コマンドプロンプトで実行するプログラムをCで作成しました(これをXXX.exeとします)。このプログラムは計算が終了した後で、その結果のファイルを作成します(これをYYY.txtとします)。このプログラムを操作し、結果を表にして出力するために、ExcelVBAでshellを使って以下のようなプログラムを作成しました。   shell("XXX.exe")   call Output Outputでは、XXX.exeが作成したファイルYYY.txtからデータを読み込んでシートに結果を出力するのですが、うまくファイルを読み込みません。多分、shellにより実行したXXX.exeが終了する前にOutputが呼ばれているのだと思うのですが、もしそうだとしたらどのような解決方法があるのでしょうか。よろしくお願いします。 WinXp、Excel2000です

  • VBAにおいて、""内で変数を使用したい

    VBAにおいて、""内で変数を使用したい 0864_001.xls 0864_002.xls … 0864_009.xls というファイルがあるとき、0864_001.xlsを開く→処理→閉じる→0864_002.xlsを開く→… というように処理をしたいと思い、以下のようなマクロを作成しました。 Sub Test() Dim i As Integer For i = 1 To 9 Workbooks.Open ThisWorkbook.Path & "\0864_00i.xls" 処理 閉じる Next i End Sub 実行しようとしてもファイルを開くことが出来ずに困っています。 ""内で変数を使うことは出来ないのでしょうか? また、どのようにすれば実行できるようになるのか教えてください。

  • shellで$入り変数に値を代入する方法

    shellで、変数への代入処理で困っています。 下記サンプルソースのように代入する変数自体にfor文で使用している変数が含められるようにしたいのですが、下記の通りだと実行できません。 うまく意図通りに動かす方法はございませんでしょうか? ---------------------------------------------------------------- #!/bin/sh #変数初期化 n00=0 n01=1 n02=2 n03=3 n04=4 #メインルーチン for i in 00 01 02 03 04 ; do temp=`eval echo '$'"n"${i}` #変数値をtempに格納 n${i}=`expr ${temp}+1` #各変数の値を+1する。 n${i}の部分をどのようにすればよいか不明 done ---------------------------------------------------------------- # 望ましい結果 echo ${n00} -> 1 echo ${n01} -> 2 : ※制約事項 ・ shのみ使用可能で、ksh,csh.bashは使用不可 ・ n[0]=0,n[1]=1・・・というように配列の使用は無し

専門家に質問してみよう