1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Powershell 変数の展開 Export-Csv Get-ChildItem のような -path の位置で+演算子を使わずに文字列を結合させてフォルダ名をやファイル名を指定する方法

Last updated at Posted at 2020-05-16

通常は+演算子で結合させると書いてありますがエラーになります。

C:\Hoge\Folder1というフォルダーを前提とします。

Get-ChildItem "C:\hoge" + "Folder1"はエラー

Get-ChildItem "C:\" + "Folder1";

Get-ChildItem : 引数 'Folder1' を受け入れる位置指定パラメーターが見つかりません。

文字列を変数に入れて+演算子で結合させることもできません

$sDrive = 'C:\hoge'
$sFolder = '\Folder1'
Get-ChildItem $sDrive + $sFolder

同様に位置していパラメーターが見つかりませんとなります。
要は文字列変数に入れても+演算子で結合できないのです

スタンダードな解決方法Join-Path

この場合通常のサイトではJoin-Pathが使われます
これは2つスペースを並べて開けると結合されるのです
この時、末端の円マーク(Qiitaや海外ではバックスラッシュ)が結合する部分では不要です。

Join-Path "C:\hoge" "folder1"
Join-Path 'C:\hoge' 'folder1'
Join-path 'C:\hoge' 'folder1\'
2番めは末尾にバックスラッシュをつけても良いです。
また、架空のフォルダでも作ることができます。

Join-Pathがエラーになる例です

Join-Path 'C:\hoge\' 'folder1'
hogeのあとに円マーク(バックスラッシュ)があるのが原因です

Join-Pathの弱点

Join-Pathは2つの変数しか結合できません。
しかしパス名は深層になるほど長く複雑で、Join-Pathを繰り返す必要が出てきます。

結合の本当の方法

ふと思いついて
ドル記号をつけてかっこでくくると変数のように扱えるパワーシェルの機能を使うのでは?
と思いついて実験してみました。
それが答えのようです。

test-path (join-path "C:\Hoge" $('Fol' + 'der1'))
Get-ChildItem $('C:\' + 'hog' +'e\' + 'folder' +'1')
という感じです。
Join-Pathでも上記のように2つに集約すると起動します。
びっくりですね。

ダブルクォーテーションを使う時

ファイル、フォルダ名の途中に空白がある場合にはダブルクォーテーションを使用してください。
https://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57
これはなぜかというのはどこにも書いていないのですが、ダブルクォーテーションは変数が入っていると展開するという機能が関係していると考えています。
$var1 = 'c:' ; $var2= '\hoge';$var3 = "$var1$var2"
これでもC:\hoge\folder1という文字列が得られます。
dir "$var1$var2"
フォルダが実在しているとこれが成功します。
つまりわざわざJoin-Pathを使わなくてもいい場合もあるわけです。

まとめ

Powershellのコマンドレットで -pathの位置に文字列を結合させたいときは

1.ドル記号とカッコでつつんで+で結合させる方法

2.変数に代入し、代入した変数をならべてダブルクォーテーションで囲む方法。"$var1$var2"ダブルクォーテーションで囲むことによって変数が展開されるため。より厳密にいうと、波括弧で変数を囲む "${var1}${var2}"

しかし通常Powershellを使われている方は全くこの制約を苦にしていないらしく、資料があまりありません。なのでこれよりいい方法があるのかもしれません。

補足

波カッコ(中カッコ)の使用

文字列の中で変数を展開する方法

ちなみに変数名を {} で囲まなくても変数を展開することはできますが、この場合 $ の後から次の半角スペースまでを変数名として認識します。半角スペースを入れ忘れると、変数名が誤認識されます。

上のまとめを変更しましたが、より厳密には変数を波括弧で囲むか、スペースを入れる方法が正しいそうです。しかしスペース自体が誤認識されがちなので、波括弧が良いようです。この記事のタイトルからすると自分がやりたかったのは、Powershellの文法においては、文字列を結合するのではなく、変数を展開するという概念に含まれているようです。

プラス演算子が有効なケース

文字列を連結する - PowerShell プログラミング
色々なパターンを試すと、+演算子は
単独で演算
$a + $b
若しくは
右辺の変数に代入する
というケースで成功するようです。

$vbCrLf = "`n`r"
$a = 'a'
$b = 'b'
$a += $b
Write-Host $a
Remove-Variable a
Remove-Variable b
write-host '$a +"b"右辺でなければ必ず成功する'
$a = 'a'
$a +  'b' #右辺でなければ必ず成功する
Write-Host $a 
Remove-Variable a
# Remove-Variable b
Write-Host '右辺が文字だけなら有効'
$a = 'a' + 'b' #文字だけならabで成功する
Write-Host $a   # ab
Remove-Variable a
# Remove-Variable b
Write-Host '右辺が文字と変数でも成功する。つまり左辺の変数に対して文字列を結合して代入するなら+演算子は成功する'
$a = 'a' #文字だけならabで成功する
$b = $a + 'b' #文字だけならabで成功する
Write-Host $b  # ab
Remove-Variable a
Remove-Variable b
Write-Host '+=は左辺が文字でも成功する'
$a = 'a'
$a += "b"
Remove-Variable a
# Remove-Variable b
Write-Host '変数aに代入'
$a = 'a'
$b = 'b'
Write-Host 'aが表示'
$a | write-host 
Write-Host '+演算子を使うと+が入って失敗'
Write-Host $a + $b # a + b
Write-host "$a$b"  # ab
Write-Host '空白を入れると空白が入って失敗'
Write-host "$a $b"  # a b
Write-Host '改行も連続'
Write-host "$a$vbCrLf$b"  # a<carrige return>b
Write-Host '結果だけではわからないが、波括弧を使って"${a}${vbCrLf}${b}"のようになっている'
Write-host "${a}${vbCrLf}${b}"  # a<carrige return>b
Write-Host '結果だけではわからないが、波括弧を使って"${a}`n`r${b}"のようになっている'
Write-host "${a}`n`r${b}"  # a<carrige return>b
Write-Host '結果だけではわからないが、波括弧を使って"$a`n`r$b"のようになっている'
Write-host "$a`n`r$b"  # a<carrige return>b
Write-host "$a $vbCrLf $b"  # a <carrige return> bのようになる
Remove-Variable a
Remove-Variable b

変数の展開

一般的には文字列を表す変数同士の結合、変数の展開はWikipediaによると文字列補完という概念に含まれるようです。
展開は英語だとdevelop deploy expand spillが使われますが、Powershell はExpansionといっており、Powershell Variable Expansionで検索できます。公式ですら2006年からそう説明しています。
Variable expansion in strings and here-strings魚拓やはり答えは式の展開です。
しかし、自分と同じように+演算子が使えず悩んでいた人がいますね。VBやcmdからくると思いつかないんですよね。
https://www.it-swarm.dev/ja/powershell/powershell%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E5%A4%89%E6%95%B0%E3%82%92%E9%80%A3%E7%B5%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1070812649/

1
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?