質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

3回答

8356閲覧

PowerShellでのカレントディレクトリの取得

AT_WORK24

総合スコア9

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/11/14 00:47

PowerShell内にて
同ディレクト内のxmlファイルを読み込み、
記載してあるパスを取得したいのですが、
カレントディレクトリの値の取得がどうもうまくいきません。。。

(記述コード)
#パスファイル読み込み
$myPath = $MyInvocation.MyCommand.Path
[xml]$xml = Get-Content $myPath"\path.xml"
$PATH = $xml.config.path

どなたかお詳しい方がいらっしゃいましたら、ご教授いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/11/16 06:29 編集

タイトルの問題は zuishin様とのやり取りで解決しているようなのでこの質問を解決済みにしてください。回答者が時間をかけてこの質問を読んで 他の質問者が回答を得られるまでにかかる時間が伸びてしまいます。
guest

回答3

0

何がうまくいかないのかわからないけど、とりあえずカッコで括ったらどうでしょう?

ps1

1(pwd)

あと、用語が間違っていたら話が通じません。必要なのは本当にカレントディレクトリなのか確認してください。

#追記

次のスクリプトを試してください。
else ブロックの中が管理者権限で行われる処理です。
コマンドライン引数も一応対応させました。

ps1

1using namespace System.Security.Principal 2 3$isSu = ([WindowsPrincipal][WindowsIdentity]::GetCurrent()).IsInRole([WindowsBuiltInRole]"Administrator") 4if (-not $isSu) { 5 $powershell = [Environment]::GetCommandLineArgs()[0] 6 $startInfo = New-Object System.Diagnostics.ProcessStartInfo $powershell, ([string]::Join(' ', (@($PSCommandPath) + $args))) 7 $startInfo.WorkingDirectory = Get-Location 8 $startInfo.Verb = "runas" 9 [void][Diagnostics.Process]::Start($startInfo) 10} else { 11 $PSScriptRoot 12 Read-Host 13}

投稿2018/11/14 03:22

編集2018/11/14 07:09
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AT_WORK24

2018/11/14 03:34 編集

$myPath = $MyInvocation.MyCommand.Path ありがとうございます。 上記のコードの箇所で$myPath に実行しているスクリプト自体のパスが入る想定だったのですが、 値が空で入ってきてしまうんです。。 調べると、$PSScriptRootや$MyInvocation.MyCommand.Pathでスクリプト自体のパスが取得できるようなのですが・・・どちらも試してみたのですが、 Get-Content $myPath"\path.xml" で$myPathに値が入ってないため、ファイルが存在しませんのエラーとなってしまうという現状です。。。
AT_WORK24

2018/11/14 03:39

#path.xml <config> <path>C:\</path> </config> xmlファイル自体の内容は上記となっています。
Zuishin

2018/11/14 03:46

それはカレントディレクトリではなくスクリプトのあるディレクトリですね。 $PSScriptRoot に何が入っているかそれ単独で表示してみてください。
AT_WORK24

2018/11/14 04:00

$PSScriptRootのみを変数に代入し表示したのですが、 コンソールには何も表示されませんでした。。
Zuishin

2018/11/14 04:03

変数に代入して実行するのではなく、同じディレクトリに新しいスクリプトファイルを作り、そこで $PSScriptRoot のみを表示してみてください。
AT_WORK24

2018/11/14 05:47

単独で実行したところ、スクリプト自身のパスを取得できていました。 本スクリプトファイル、batファイルからpowerShellを起動して実行しているのですが、それがなにか起因しているんですかね、、
Zuishin

2018/11/14 05:49

問題の再現する最小限のスクリプトおよびバッチを作ってください。
AT_WORK24

2018/11/14 05:54

@(echo '> NUL echo off) NET SESSION > NUL 2>&1 IF %ERRORLEVEL% neq 0 goto RESTART setlocal enableextensions set "THIS_PATH=%~f0" set "PARAM_1=%~1" PowerShell.exe -Command "iex -Command ((gc \"%THIS_PATH:`=``%\") -join \"`n\")" PAUSE exit /b %errorlevel% :RESTART powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process %~f0 -Verb runas" exit ') | sv -Name TempVar #スクリプト自身のパスを取得 $myPath = $PSScriptRoot #表示 Write-Host $myPath
AT_WORK24

2018/11/14 05:55

これだとコンソールにスクリプト自身のパスが表示されないです。。。
Zuishin

2018/11/14 06:03

どこでスクリプトを呼び出していますか? 分岐や変数を取り払い、問題の再現する最小のバッチを作ってください。
AT_WORK24

2018/11/14 06:05

上記のコードをコピーして、batファイルにして実行してください。
Zuishin

2018/11/14 06:15

実行結果は聞いたので興味ありません。
AT_WORK24

2018/11/14 06:17

問題の再現する最小のバッチがこちらになるんですが、、、
Zuishin

2018/11/14 06:19

最小ではありません。 分岐と変数を取り払ってください。 環境によって違う結果になります。
AT_WORK24

2018/11/14 06:27

すみません>< 管理者権限で実行したいしたいので。。 知識が乏しくこれ以上簡略化できなそうです。。
Zuishin

2018/11/14 06:32

bat と ps1 のファイル名は何ですか?
Zuishin

2018/11/14 06:33

あと、このバッチファイルの元ネタはどこにありますか?
Zuishin

2018/11/14 06:46

わかりました。バッチを使わず PowerShell スクリプトのみで行うのがいいと思います。 コマンドライン引数は必要ですか? つまり、スクリプト名を untitled.ps1 としたとき、「untitled.ps1 aaa bbb」のようにオプションで引数を指定できる必要がありますか?
AT_WORK24

2018/11/14 07:02

ありがとうございます! いえ、PowerShell スクリプトのみで行うとしても、引数を指定できる必要は特にありません。 最初はPowerShellスクリプトで行っていたんですが、常に管理者権限で実行することができずに上記の記事を参照して、バッチファイルからの起動に変更したんですよね、、
Zuishin

2018/11/14 07:10

追記しました。
AT_WORK24

2018/11/14 07:14

丁寧にありがとうございます! #スクリプト自身のパスを取得 $myPath = $PSScriptRoot #表示 Write-Host $myPath 実際に処理したい上記のコードは、Elseブロックの中に記述していく感じですかね??
Zuishin

2018/11/14 07:16

上記コードをコピーして、ps1 ファイルにして実行してください。
AT_WORK24

2018/11/14 07:17

ps1ファイルにして、何も追記せずに実行したんですが、新規ウインドウが起動し続けますね。。
AT_WORK24

2018/11/14 07:18

パスとれました。 追記して実行してみます。
AT_WORK24

2018/11/14 07:23

ちなみにbatファイルで同じ動きを実現するのって難しいんですかね・・・?
Zuishin

2018/11/14 07:24

起動し続けるというのはウィンドウが無限に作られるということですか? パスとは何ですか? 追記して実行とはどういうことですか? 管理者名は Administrator ですか?
Zuishin

2018/11/14 07:29 編集

バッチでは作ったことが無いのでわかりません。 ここに提示されているものではできないということなので、こちらで確かめられないので ps1 にしました。 こちらで実行して正常動作することを確かめた上で書いていますので、これでうまくいかないなら他に原因があるのかもしれません。 どのように実行して、どのように動作するのかを詳しく書いてください。
AT_WORK24

2018/11/14 08:33

上記のスクリプトを元にして、実行うまくいきました! ありがとうございます! xmlファイルの保存についてもお聞きしていいでしょうか。 $myPath = $MyInvocation.MyCommand.Path [xml]$xml = Get-Content $myPath"\path.xml" #編集対象のxmlファイルのパスを取得 $PATH = $xml.config.path #編集対象のxmlファイルの指定 [xml]$Test = Get-Content $PATH"test.xml" -Encoding UTF8 #保存 $Test .Save($PATH"test.xml") これだと保存の箇所でエラーになって保存が行えないのですが、 (絶対パス指定だと正常に保存されます) もし、変数のパス指定で保存する方法をご存じでしたら、教えていただけると有難いです・・・ 何度もすみません。
Zuishin

2018/11/14 08:45

これは全く別の質問ですね。この質問をクローズして新しく質問してください。 質問する際には、見る人がこの質問を参照しなくていいよう気を使って書いてください。そしてコードはコードブロックを使ってください。
guest

0

参照されている
https://s.webry.info/sp/vogel.at.webry.info/201707/article_9.html
の手法では$PSScriptRootや$MyInvocation.MyCommand.Pathの取得が難しいため、
バッチとps1の2つに分かれますが以下のような方法は如何でしょうか?

batch

1@echo off 2powershell -command "start-process powershell.exe -argumentlist %~dp0hoge.ps1 -Verb runas" 3exit

hoge.ps1

powershell

1$myPath = $PSScriptRoot 2[xml]$xml = Get-Content (join-path $myPath 'path.xml') 3$PATH = $xml.config.path

投稿2018/11/14 08:49

Turkis_Mond

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「powershell カレントディレクトリ」でぐぐってみよう

投稿2018/11/14 01:39

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AT_WORK24

2018/11/14 02:35

ぐぐった結果で試してもうまくいかなかったので。。
y_waiwai

2018/11/14 03:20

どう試しました? それがわからないとアドバイスもできないかと
AT_WORK24

2018/11/14 03:35 編集

$myPath = $MyInvocation.MyCommand.Path ありがとうございます。 上記のコードの箇所で$myPath に実行しているスクリプト自体のパスが入る想定だったのですが、 値が空で入ってきてしまうんです。。 調べると、$PSScriptRootや$MyInvocation.MyCommand.Pathでスクリプト自体のパスが取得できるようなのですが・・・どちらも試してみたのですが、 Get-Content $myPath"\path.xml" で$myPathに値が入ってないため、ファイルが存在しませんのエラーとなってしまうという現状です。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問