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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

7263閲覧

Powershellでショートカットのリンク先(参照先)の値を置き換えたい

退会済みユーザー

退会済みユーザー

総合スコア0

PowerShell

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/05/18 02:23

編集2021/05/24 09:27

前提・実現したいこと

デスクトップのショートカットのリンク先(参照先)を変更したいと思っております。
条件としては、リンク先(参照先)に"\123.456.78.9"があれば "\123.456.78.8"に置き換える、変更するというものです。
エラーの内容からコードに原因等ございますでしょうか。。

発生している問題・エラーメッセージ

New-Object : 引数 'System.Object[]' を受け入れる位置指定パラメーターが見つかりません。 発生場所 行:1 文字:12 + $wsShell = New-Object -ComObject WScript.Shell $shortcuts | ForEach-O ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Object]、ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

該当のソースコード

##### # デスクトップ、およびデスクトップ上のフォルダ内の # ショートカットファイルの参照先を書き換える ##### ## レガシーな環境用の共有フォルダパス文字列を新しい環境用に置き換えるfuntion function ReplacePath([string] $path) { # 例1:\192.0.2.1\share1\~ → \file1.example.jp\share1\~ $path = $path -ireplace "\123.456.78.9\", "\123.456.78.8\" Return $path } # メイン処理 Write-Output "デスクトップ上のショートカットの更新を開始します。" $desktop = [System.Environment]::GetFolderPath('Desktop') $shortcuts = Get-ChildItem $desktop *.lnk -Recurse # PowerShellにショートカットを編集できるコマンドレットは無い。WSHを使う。 $wsShell = New-Object -ComObject WScript.Shell $shortcuts | ForEach-Object { # 更新の必要があるショートカットファイルなのかを確認 $link = $wsShell.CreateShortcut($_.FullName) $newTargetPath = ReplacePath($link.TargetPath) if ($newTargetPath -eq $link.TargetPath){ Write-Output ("置き換えの必要なし: " + $_.FullName) return } # ショートカットの参照先と作業フォルダーを更新 $link.TargetPath = $newTargetPath $link.WorkingDirectory = ReplacePath($link.WorkingDirectory) $link.Save(); Write-Output ("置き換えを実行: " + $_.FullName) } Write-Output "デスクトップ上のショートカットの更新が完了しました。"

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

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

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

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

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

K_3578

2021/05/24 05:59

質問内容を意図的に意味のない文章に改変するのは禁止されています。 元の質問文に戻して下さい。 何かしら内容を隠したい理由があってやったにせよ、誰でも編集履歴から内容を確認出来ます。 質問文を外部に公開されて困る理由があるなら下記リンクから運営に相談して下さい。 真っ当な理由であれば内容削除などしてくれるかもしれません。 https://teratail.com/contact/input
K_3578

2021/05/24 06:59

退会しおった・・・。回答得てから内容消すとか最低の行為だと気付いてほしい
退会済みユーザー

退会済みユーザー

2021/05/24 09:09

K_3578様、御注意していただきありがとうございます。 何か理由があったのかどうかわかりませんが、こういう方もいるのですね。
guest

回答1

0

ベストアンサー

WScript.Shellと$shortcutsの間で改行、
あと、最後の行もWrite-outputの直前で改行する必要があるとおもいます。

ps

1##### 2# デスクトップ、およびデスクトップ上のフォルダ内の 3# ショートカットファイルの参照先を書き換える 4##### 5 6## レガシーな環境用の共有フォルダパス文字列を新しい環境用に置き換えるfuntion 7function ReplacePath([string] $path) { 8 # 例1:\192.0.2.1\share1\~ → \file1.example.jp\share1\~ 9 $path = $path -ireplace "\123.456.78.9\", "\123.456.78.8\" 10 Return $path 11} 12 13# メイン処理 14Write-Output "デスクトップ上のショートカットの更新を開始します。" 15$desktop = [System.Environment]::GetFolderPath('Desktop') 16$shortcuts = Get-ChildItem $desktop *.lnk -Recurse 17 18# PowerShellにショートカットを編集できるコマンドレットは無い。WSHを使う。 19$wsShell = New-Object -ComObject WScript.Shell 20$shortcuts | ForEach-Object { 21 # 更新の必要があるショートカットファイルなのかを確認 22 $link = $wsShell.CreateShortcut($_.FullName) 23 $newTargetPath = ReplacePath($link.TargetPath) 24 if ($newTargetPath -eq $link.TargetPath){ 25 Write-Output ("置き換えの必要なし: " + $_.FullName) 26 return 27 } 28 # ショートカットの参照先と作業フォルダーを更新 29 $link.TargetPath = $newTargetPath 30 $link.WorkingDirectory = ReplacePath($link.WorkingDirectory) 31 $link.Save(); 32 Write-Output ("置き換えを実行: " + $_.FullName) 33} 34Write-Output "デスクトップ上のショートカットの更新が完了しました。"

投稿2021/05/20 03:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/24 02:53

qnoirさん、お忙しいなかで回答ありがとうございます。 実行してみたところ、下記のようなエラーがでました(IPアドレスは仮で記載しております) 調べているところどうやらエスケープ処理?が必要とのことですが、どのような表記に変更すればよいのでしょうか。。答えを聞くようで大変申し訳ございません。。「 ---- 正規表現パターン \123.456.78.9\ が無効です。 発生場所 行:3 文字:5 + $path = $path -ireplace "\123.456.78.9\", "\123.456.78.8\" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (\123.456.78.9\:String) []、RuntimeException + FullyQualifiedErrorId : InvalidRegularExpression
退会済みユーザー

退会済みユーザー

2021/05/24 02:57 編集

「\」記号をエスケープする必要があるということですね (「\」というように二重にする) $path = $path -ireplace "\\123.456.78.9\", "\\123.456.78.8\" に修正した場合どうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問