这应该是一个简单的任务,但我已经看到了几次尝试如何获取执行cmdlet所在目录的路径,并取得了成功.例如,当我执行C:\temp\myscripts\mycmdlet.ps1哪个有设置文件时,C:\temp\myscripts\settings.xml我希望能够存储C:\temp\myscripts在一个变量中mycmdlet.ps1.
这是一个有效的解决方案(虽然有点麻烦):
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'
Run Code Online (Sandbox Code Playgroud)
另一个人建议这个解决方案只适用于我们的测试环境:
$settingspath = '.\settings.xml'
Run Code Online (Sandbox Code Playgroud)
我非常喜欢后一种方法,并且更喜欢每次都必须将文件路径解析为参数,但我不能让它在我的开发环境中工作.有没有人建议做什么?它与PowerShell的配置方式有关吗?
我希望能够告诉我执行脚本的运行路径.
这往往不是$ pwd.
我需要调用相对于我的脚本的文件夹结构中的其他脚本,虽然我可以对路径进行硬编码,但是当尝试从"开发"升级到"测试"时,这既令人反感又有点痛苦"生产".
我有一个PowerShell脚本D:\temp.
当我运行此脚本时,我希望列出该文件的当前位置.我该怎么做呢?
例如,此代码将在DOS批处理文件中完成; 我想将其转换为PowerShell脚本...
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
Run Code Online (Sandbox Code Playgroud) 编辑:简而言之,对于未来的读者来说,PowerShell脚本并不打算以这种方式使用,这就是为什么没有优雅的解决方案.
我有以下行从快捷方式以管理员身份运行脚本:
C:\ Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -noexit Start-Process Powershell -verb RunAs -ArgumentList"C:\ Documents\WindowsPowerShell\Scripts\test.ps1"
我想改变:
"C:\文档\ WindowsPowerShell \脚本\ test.ps1"
到相对路径,如:
"\test.ps1"
但我还没弄明白我该怎么做.如何相对于快捷方式的位置运行脚本?(快捷方式和脚本在同一个文件夹中)
我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用$PSScriptRootover$MyInvocation.MyCommand.Path获取当前脚本根目录是否会出现问题。
一位同事顺便告诉我,使用$PSScriptRoot远程功能是一个坏主意,因为我可能偶尔会发现它在运行时由于某种原因或其他原因没有返回预期值,即使它以前工作过。但是,无法解释为什么会这样。
在我的研究中,我没有发现任何可以进一步解释这一点或避免此类问题的最佳实践方法的任何内容。我主要发现这两者基本上可以互换;然而,$PSScriptRoot可以仅在PowerShell中V3或更高版本一起使用。通过你们中的一些人的帮助,我还了解到它$MyInvocation具有情境差异,可以根据范围和模块进行更改。但我仍然没有发现这是否或为什么会成为 PowerShell Remoting 的问题。
示例 001
所以我在 Jenkins 中有一个 PowerShell 脚本,它$PSScriptRoot用作查找我希望通过相对路径调用的脚本的手段。我是否能够依靠它来始终为所述脚本提供相同/预期的路径?
示例 002
使用由 Jenkins 启动的 PowerShell 脚本调用的 PowerShell 脚本,我是否能够期望$PSScriptRoot能够为我提供该脚本实际所在位置的路径,或者它会给我一个基于 Jenkins 的路径?
就我个人而言,我希望两者$PSScriptRoot都能为我提供正在运行的脚本的实际物理位置,而不是根据调用它的初始脚本更改的相对路径。
由于有了这种理解将帮助我节省大量时间和头痛,我希望像您这样的程序员可以帮助我了解这是否属实,以及为什么会发生这样的问题。
我想知道使用$PSScriptRoot是否会导致我在 PowerShell Remoting 中出现问题,从而使使用$MyInvocation更可行的选项?
我有这个:
Get-ChildItem c:\H\admin\contents
Run Code Online (Sandbox Code Playgroud)
是否可以做同样的事情,但相对于 powershell 脚本运行的文件夹。有时我在 c\H\admin 中运行脚本,有时在 c\H\user 目录中运行,所以我宁愿不必更改我的脚本中的所有路径。
我创建了我的 ps1 脚本并动态获取路径我使用了这个命令
$ScriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
Run Code Online (Sandbox Code Playgroud)
当我使用 ISE 控制台时一切正常,但是当我尝试使用 ps2exe 将我的 ps1 脚本转换为 exe 时,当我执行我的 exe 文件时出现错误,因为 $ScriptPath 返回空值。
我试过这种方式但没有成功
$ScriptPath = Split-Path -Parent $PSCommandPath
Run Code Online (Sandbox Code Playgroud)
我希望脚本与版本 2 兼容。
我该如何解决?
谢谢
我有一个脚本(script1.ps1)位于C:\ FolderA
我可以在脚本中插入什么powershell代码,它将打印脚本的当前位置/路径。(目标是使此脚本可移植)
即:
-在folderA中时,代码将打印C:\ FolderA(完整路径)
-当Script1.ps1移至C:\ FolderB \ FolderC并运行时,它将打印C:\ FolderB \ FolderC的完整路径
任何帮助将非常感激。
谢谢
感谢@Nkosi和@Kori Gill
我一直在寻找的答案是$ PSScriptRoot
需要注意的一件事是,我注意到在运行脚本之前必须先在脚本内定义一个变量:
$Path = $PSScriptRoot
$Path
Run Code Online (Sandbox Code Playgroud)
与此工作,否则它没有