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

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

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

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

5336閲覧

windows batファイルで取得した引数をwindows ps1ファイルの変数に渡したいです。

neko00

総合スコア5

PowerShell

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2020/01/15 14:49

前提・実現したいこと

実現したいこと
windows batファイルで取得した引数をwindows ps1ファイルの変数に渡したいです。

前提
以下のファイルを用いて、powershellのスクリプト実行を行いたいです。

1.windows batファイル
カレントディレクトリのファイル名(引数)を取得するバッチ
2.windows ps1ファイル
1.windows batファイルで取得したファイル名(引数)を変数として
フルパスを作成する。
※ファイル名はあらかじめ分かっておらず、
1.windows batファイルを通して初めてわかるものとします。

C:\Downloads\aa(変数)

発生している問題

1.windows batファイルで引数を設定することができません
例)
カレントディレクトリ(C:\Downloads\aa)の中に3つのファイルが存在します。
b.txtのみ取得したいです。
a.txt
b.txt
c.txt

1.windows batファイルから2.windows ps1ファイルに変数を渡すことができません。

試したこと

自分なりに調べて以下のwindows batファイルと2.windows ps1ファイルを
作成しましたが、よくわかっていない状態です。

test.ps1(2.windows ps1ファイル)
Write-Host ('渡された引数1個目:' + $Args[0])

test.bat(1.windows batファイル)
cd C:\Downloads\aa
dir b/
powershell .\test.ps1 a.txt 

※a.txt を引数にしたい

ご教示のほどよろしくお願いいたします。

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

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

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

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

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

otn

2020/01/15 21:38

> 1.windows batファイルから2.windows ps1ファイルに変数を渡すことができません。 具体的にどういう現象ですか?
neko00

2020/01/15 22:19

処理ができていないので、言葉で説明します。 2つのファイルを使います。 1.windows batファイルでは、カレントディレクトリのファイル名を取得を目的とします。 1.ps1ファイルでは、1.windows batファイルで取得したファイル名を変数としたパスの後に\でつなげ、 フルパスを作成します。 (イメージ) C:\Downloads\aa\にあるテキストファイルのファイル名を取得したい。 1.windows batファイル cd C:\Downloads\aa\ ご質問ありがとうございます。 具体的な処理はわかっていませんが、やり方がわからず 詰まっているポイントは以下の通りです。 ①1.windows batファイルでファイル名を引数として格納することです。 ②2.windows ps1ファイルで1.windows batファイルの引数を受け取ることです。、 ③2.windows ps1ファイル内で②の引数と2.windows ps1上に書いた変数のパスと文字列結合することです。  (例)2.windows ps1     パス = D:\Downloads\aa\    ファイル名 = 1.windows batファイルの引数  以下の通り文字列結合する   パス + \ + ファイル名 勉強不足な点、伝わりにくく申し訳ありません。 以上よろしくお願いいたします。
imihito

2020/01/15 22:51

> テキストファイルのファイル名を取得したい のファイル名に条件はありますか? 例の`b.txt`をPowerShellスクリプトに渡したいなら、以下のようにすればいいだけですので、何か条件があるのではありませんか? ``` cd C:\Downloads\aa\ powershell -NoProfile -ExecutionPolicy Unrestricted -File .\test.ps1 b.txt ```
neko00

2020/01/15 23:40

ご回答ありがとうございます。 ファイル名の条件は D:\Downloads\aa\に存在するもの全てが対象です。 引数(ファイル名)としては一回の処理で1つのみ渡します。 n個txtファイルが存在する場合は、 n回ps1に1個ずつファイル名を渡します。
otn

2020/01/16 04:38

何をやりたいかは質問文からわかるので、補足してもらった内容は全く不要でした。 起こっている現象を聞いています。エラーメッセージなど。
neko00

2020/01/16 14:37

失礼しました。 imihito様がご回答された通りでファイル名が固定の場合は、PowerShellスクリプトに渡すことができました。 以下のbatファイル、ps1ファイルを作成しました。 [batファイル] cd C:\Downloads\aa\ dir C:\Downloads\aa\ b/ echo %%0 = %0 powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 %0.txt pause [ps1ファイル] Write-Host ('渡された引数1個目:' + $Args[0]) [問題] 実行時にエラーメッセージはありませんでしたが、 powershellに渡ったものがファイル名のみではなく、 C:\Downloads\aa\test.bat(フルパス)になっていました。 変数の使い方が分かっておらず困っています。 よろしくお願いいたします。
otn

2020/01/16 15:38

質問文の、 > 変数を渡すことができません。 と、 > powershellに渡ったものがファイル名のみではなく、C:\Downloads\aa\test.bat(フルパス)になっていました。 と矛盾する記述となっていますが、質問文が間違っていたということでしょうか?
neko00

2020/01/18 03:49

失礼しました。 状況を整理してから再度質問させていただきます。
guest

回答1

0

ベストアンサー

試してみましたが引っかかると思われる部分は二点ぐらいですね。

まずtest.batファイル内でcdコマンドでカレントディレクトリを移動させているため、
test.ps1ファイルがC:\Downloads\aa\ディレクトリ内にないと見つからず実行できませんが、
この点は問題ないでしょうか。

またデフォルトのPowershellの設定ではセキュリティ上、スクリプトの実行権限が設定されていないので実行できません。
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 a.txt
のように実行権限を指定して実行させる必要があります。

追加質問への回答

コマンドプロンプトバッチだと配列が正式にサポートされていないので配列っぽく見せたやり方になります。
始めの質問で上げられてたa,b,c.txtで例にすると

bat

1SET ARRAY[1]=a 2SET ARRAY[2]=b 3SET ARRAY[3]=c 4 5SETLOCAL ENABLEDELAYEDEXPANSION 6FOR /l %%N IN (1,1,3) DO ( 7 CALL powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 %%ARRAY[%%N]%%.txt 8) 9ENDLOCAL

指定ファイル数を増やしたい場合、「SET ARRAY[数字]=」の項目を追加し、
「FOR /l %%N IN (1,1,ループ数) DO (」のループ数の部分を増やしてください。

投稿2020/01/15 15:16

編集2020/01/17 00:27
yureighost

総合スコア2183

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

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

neko00

2020/01/15 22:22

ご回答ありがとうございます。 まずtest.batファイル内でcdコマンドでカレントディレクトリを移動させているため、 test.ps1ファイルがC:\Downloads\aa\ディレクトリ内にないと見つからず実行できませんが、 この点は問題ないでしょうか。 →存在した状態でテストしているので問題ありません。 またデフォルトのPowershellの設定ではセキュリティ上、スクリプトの実行権限が設定されていないので実行できません。 powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 a.txt のように実行権限を指定して実行させる必要があります。 →実行権限の指定の設定は漏れていました。  後ほど試します。  ありがとうございます。
imihito

2020/01/15 22:46

powershell.exe を使用するのであれば、 `powershell -NoProfile -ExecutionPolicy Unrestricted -File .\test.ps1 a.txt` と`-File`を指定した方が良いですね(以降の文字列の解析方法が変わるので)。
neko00

2020/01/16 14:18

ご回答ありがとうございます。 実行権限も含めて修正したところ、無事にファイルをスクリプトに渡すことができました。 さらに質問してもよろしいでしょうか? ファイル名の取得の部分の処理の作り方がわからず困っています。 例では、a.txtとファイル名が固定ですが、カレントディレクトリのフォルダ内にある N個のファイルをのファイル名を一つずつ取得し、 powershellにファイル名を渡すことを目的としています。 powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 a.txt  powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 可変.txt
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問