2014-03-18 56 views
6

編輯從運行腳本的快捷方式:爲了未來的讀者,總之,PowerShell腳本並不打算這樣使用這就是爲什麼沒有完美的解決方案。的PowerShell:使用相對路徑

我有一個運行一個腳本從快捷管理員以下行:

C:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \ powershell.exe -noprofile -noexit開始處理PowerShell的-verb運行方式-ArgumentList 「C:\文檔\ WindowsPowerShell \腳本\ test.ps1」

我想改變:

「C:\文檔\ WindowsPowerS地獄\腳本\ test.ps1"

像一個相對路徑:

」。\ test.ps1"

但我還沒有想通了,我該怎麼辦那。我怎樣才能相對於快捷方式的位置運行腳本? (快捷方式和腳本是在同一文件夾)

+0

[確定當前PowerShell腳本位置的最佳方式是什麼?](http://stackoverflow.com/questions/5466329/whats-the-best-way-to-determine-the-location -of-the-current-powershell-script) –

+0

這是一個實際的快捷方式,通過右鍵單擊並拖動並選擇Create Shortcuts Here?或者這是一個啓動PowerShell腳本的批處理文件?或者這是從計劃任務啓動的?或其他?請儘可能明確。 –

+0

@Entbark:通過在此處右鍵單擊並選擇創建快捷方式創建的實際快捷方式。 –

回答

3

這是一個醜陋的解決方法。

Shortcut.lnk文件與目標:%COMSPEC% /C .\launcher.cmdsource),並開始在:%CD%(或blank)。

Launcher.cmd文件與內容:

Powershell -noprofile -noexit -File %CD%\PSlauncher.ps1 

PSlauncher.ps1文件與內容:

Start-Process Powershell -verb RunAs -ArgumentList ($pwd.path + "\test.ps1") 

肯定有一個更好的解決方案。也許與-WorkingDirectory參數​​?或storing credentials與Convert * -SecureString cmdlet?算我好奇。

Why你想要的快捷方式?

+0

感謝這個解決方案的工作原理,但正如你所提到的,它很難看。基本上我想要一個簡單的方法將腳本分發給對PowerShell一無所知的人。環顧四周,似乎將腳本打包成exe或創建gui將是另一個解決方案。 –

+0

是的。 [這](https://labs.vmware.com/flings/web-commander)在演示中看起來不錯,但我還沒有嘗試過。當然它配備了咖啡機和烤箱,你可能不需要...... – noam

0

當我運行從一個快捷方式的腳本,它使用實際的腳本的路徑。您可以用pwd(當前工作目錄)檢查當前目錄。您可以使用split-path -parent $MyInvocation.MyCommand.Definition檢查(然後使用)腳本的路徑,如What's the best way to determine the location of the current PowerShell script?中的答案所示。

因此,要回答你的問題,你應該已經能夠使用相對路徑。你試過了嗎?如果是這樣,你的經歷是什麼?

+0

你能舉一個我需要使用的語法的例子嗎? –

+0

你能更具體嗎?哪部分你需要語法?您似乎已經知道如何使用您的問題中演示的相對路徑。 –

+0

將''C:\ Documents \ WindowsPowerShell \ Scripts \ test.ps1「'更改爲'」。\ test.ps1「',然後單擊該快捷方式,提示它無法識別'」。\ test.ps1「'作爲cmdlet,可執行文件等 –

0

您的腳本,將其設置使用PowerShell在默認情況下打開。爲您的腳本創建快捷方式,並通過右鍵單擊快捷方式,選擇屬性,單擊快捷方式選項卡,爲其分配熱鍵。移動光標選擇快捷鍵並定義一個快捷鍵。每次按下快捷鍵時你的腳本將運行

-1

這絕對是做出來更加困難比它。

此問題更可能影響您在Windows Server上。在常規Windows上,您可以運行Set-ExecutionPolicy unrestricted,它將保持對機器的影響,在Windows Server上(至少在AWS上),從powershell腳本設置執行策略只會持續腳本的會話並且會立即關閉,因此您看不到錯誤。

我剛成功修改了AWS實例bypassing group policy上的註冊表,只需右鍵單擊任何目錄下的powershell腳本,並將快捷方式發送到可運行的桌面。

1

大量的試驗和錯誤後,我想出了一個解決方案:

創建此快捷方式(編輯爲您的.ps1)有scrips相對作爲管理員到任意目錄下運行:

CMD /C PowerShell "SL -PSPath '%CD%'; $Path = (GL).Path; SL ~; Start PowerShell -Verb RunAs -Args \""SL -PSPath '"$Path"'; & '".\YourScriptHere.ps1"'"\"" 

您必須清空快捷方式的「開始」字段以將其相對路徑設置爲工作目錄。

或者,這裏有一個腳本,將產生這些快捷方式爲每個名爲.ps1的一個目錄中(與「開始在」已清除):

(GCI | Where-Object {$_.Extension -eq ".ps1"}).Name | ForEach-Object { 
    $WshShell = New-Object -ComObject WScript.Shell 
    $Shortcut = $WshShell.CreateShortcut((GL).Path+"\$_ Run.lnk") 
    $Shortcut.TargetPath = 'CMD' 
    $Shortcut.Arguments = "/C PowerShell `"SL -PSPath `'%CD%`'; `$Path = (GL).Path; SL ~; Start PowerShell -Verb RunAs -Args \`"`"SL -PSPath `'`"`$Path`"`'; & `'`".\$_`"`'`"\`"`""  
    $Shortcut.IconLocation = 'PowerShell.exe' 
    $Shortcut.Save() 
} 

如果需要的話,加-NoExit-ExecutionPolicy Unrestricted,等等。剛剛在第一個\"之後。

注:

究其原因,PowerShell與第一發射第二,管理實體,是直接啓動以admin(打勾的快捷方式的「以管理員身份運行」框),用於some reason忽略「開始在「並且始終在System32中啓動。

CMD正用於啓動第一個實例,因爲PowerShell當前無法解析包含方括號的路徑,將它們解釋爲正則表達式字符。這通常可以通過使用LiteralPath參數(aka PSPath)來避免,但是在這裏,路徑在啓動時在幕後傳遞,並且由開發人員來修復(我剛剛提交了一個錯誤報告here)。