Powershell ISE의 두 번째 myScript2.ps1 스크립트 내에서 myScript1.ps1 스크립트에 대한 호출 실행을 원합니다.
MyScript2.ps1의 다음 코드는 Powershell 관리에서 제대로 작동하지만 PowerShell ISE에서는 작동하지 않습니다.
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
PowerShell ISE에서 MyScript2.ps1을 실행할 때 다음 오류가 발생합니다.
‘. \ myScript1.ps1’이라는 용어는 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다. 이름의 철자를 확인하거나 경로가 포함 된 경우 경로가 올바른지 확인한 후 다시 시도하십시오.
답변
스크립트의 위치를 찾으려면 Split-Path $MyInvocation.MyCommand.Path
을 사용하십시오 (스크립트 컨텍스트에서이를 사용하십시오).
이 예제 스크립트로 다른 것을 사용하지 말아야 할 이유를 설명 할 수 있습니다.
## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path
결과는 다음과 같습니다.
PS C : \ Users \ JasonAr>. \ ScriptTest.ps1 호출 이름 :. \ ScriptTest.ps1 경로 : C : \ Users \ JasonAr \ ScriptTest.ps1 PS C : \ Users \ JasonAr>입니다. . \ ScriptTest.ps1 호출 이름 :. 경로 : C : \ Users \ JasonAr \ ScriptTest.ps1 PS C : \ Users \ JasonAr> & ". \ ScriptTest.ps1" 호출 이름 : & 경로 : C : \ Users \ JasonAr \ ScriptTest.ps1
PowerShell 3.0 이상 에서는 자동 변수를 사용할 수 있습니다 $PSScriptRoot
.
## ScriptTest.ps1
Write-Host "Script:" $PSCommandPath
Write-Host "Path:" $PSScriptRoot
PS C : \ Users \ jarcher>. \ ScriptTest.ps1 스크립트 : C : \ Users \ jarcher \ ScriptTest.ps1 경로 : C : \ Users \ jarcher
답변
MyScript1.ps1의 현재 경로는 myScript2.ps1과 다릅니다. MyScript2.ps1의 폴더 경로를 가져 와서 MyScript1.ps1에 연결 한 다음 실행할 수 있습니다. 두 스크립트는 모두 같은 위치에 있어야합니다.
## MyScript2.ps1 ##
$ScriptPath = Split-Path $MyInvocation.InvocationName
& "$ScriptPath\MyScript1.ps1"
답변
myScript2.ps1에서 myScript1.ps1을 호출하고 있습니다.
두 스크립트가 모두 같은 위치에 있다고 가정하면 먼저 다음 명령을 사용하여 스크립트 위치를 가져옵니다.
$PSScriptRoot
그런 다음 호출하려는 스크립트 이름을 다음과 같이 추가하십시오.
& "$PSScriptRoot\myScript1.ps1"
이 작동합니다.
답변
한 줄 솔루션 :
& ((Split-Path $MyInvocation.InvocationName) + "\MyScript1.ps1")
답변
이것은 다른 파일에 인수를 전달하기 위해 답변에 대한 추가 정보 일뿐입니다.
당신이 논쟁을 기대하는 곳
PrintName.ps1
Param(
[Parameter( Mandatory = $true)]
$printName = "Joe"
)
Write-Host $printName
파일을 호출하는 방법
Param(
[Parameter( Mandatory = $false)]
$name = "Joe"
)
& ((Split-Path $MyInvocation.InvocationName) + "\PrintName.ps1") -printName $name
입력을 제공하지 않으면 기본적으로 “Joe”로 설정되며 이는 PrintName.ps1 파일의 printName 인수에 인수로 전달되어 “Joe” 문자열을 출력 합니다.
답변
이미 답변을 찾았을 수도 있지만 여기에 내가하는 일이 있습니다.
나는 보통이 줄을 설치 스크립트의 시작 부분에 놓습니다.
if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2).
다음 예제와 같이 $ PSScriptRoot 변수를 현재 스크립트 (경로)의 위치로 사용할 수 있습니다.
if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2).
Try {
If (Test-Path 'C:\Program Files (x86)') {
$ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise64_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x64.log`""
Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop
$Result= [System.Environment]::ExitCode
} Else {
$ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x86.log`""
Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop
$Result= [System.Environment]::ExitCode
}
} ### End Try block
Catch {
$Result = [System.Environment]::Exitcode
[System.Environment]::Exit($Result)
}
[System.Environment]::Exit($Result)
귀하의 경우 교체 할 수 있습니다
시작 프로세스 … 라인
호출 식 $ PSScriptRoot \ ScriptName.ps1
Microsoft 사이트에서 $ MYINVOCATION 및 $ PSScriptRoot 자동 변수에 대한 자세한 내용을 확인할 수 있습니다 : https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables
답변
호출자와 동일한 폴더 (또는 하위 폴더)에서 스크립트 파일을 쉽게 실행하려면 다음을 사용하십시오.
# Get full path to the script:
$ScriptRoute = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, "Scriptname.ps1"))
# Execute script at location:
&"$ScriptRoute"
