2017-07-15 54 views
1

我是一個完整的bb和powershell腳本編寫的newb,並且一直在試圖弄清楚如何在powershell中定義一個變量,並在同一個目錄中存儲的批處理腳本中定義一個變量作爲PowerShell腳本。從同一個目錄中的.bat文件抓取powershell變量

基本上,我想要從config.bat中獲取Dropbox Path並將變量$ dropbox設置爲在powershell腳本中的其他變量中使用。這是我到目前爲止....

config.bat:

@Echo OFF 
set Dropbox_Path=C:\Users\User\Documents\Dropbox 

test.ps1摘錄:如果我指定的

#Grab Dropbox Path from config.bat and set $dropbox variable 

$dropbox = Get-Content C:\Users\User\Documents\Dropbox\test\Batch-Files\config.bat ` 
      | ? { $_ -match "Dropbox_Path=\s*"} ` 
      | select -First 1 ` 
      | % { ($_ -split "=", 2)[1] } 

# Set other Variables using $dropbox 

$input_csv = "$dropbox\test\Test.csv" 
$master_csv = "$dropbox\test\Test-MASTER.csv" 
$output_file = "$dropbox\test\Test.txt" 

一切正常config.bat文件的絕對路徑(如圖所示),但如果我嘗試使用相對路徑$PSScriptRoot\config.bat.\config.bat,則出現錯誤,powerhsell找不到顯示錯誤的config.bat文件...

「Get-Content:無法找到路徑'C:\ config.bat',因爲它不存在 。」

我也曾嘗試的另一種方式,並使用寫入主機,看看是否變量顯示正確的目錄....

$configFullPath = "$($pwd)\config.bat" 
Write-Host "Config file full path = $configFullPath" 

Import-Module -Force $configFullPath 

$dropbox = Get-Content _config.bat ` 
      | ? { $_ -match "Dropbox_Path=\s*"} ` 
      | select -First 1 ` 
      | % { ($_ -split "=", 2)[1] } 

Write-Host "Config file full path = $configFullPath" 
Write-Host "Dropbox Path = $dropbox" 
PAUSE 

與上面的代碼,我得到這個PS錯誤.. ..

「導入模塊:指定的模塊‘C:\用戶\用戶\ config.bat’。是 未加載,因爲沒有有效的模塊文件是在任何模塊 目錄中找到」

輸出顯示:

Config file full path = C:\Users\User\config.bat # WRONG 
Dropbox Path = 

的路徑必須是相對的,我的目的和它可能是一些令人尷尬的超級簡單,這裏的編碼大師都會讓我看起來像一個完整的numpty :)

請幫忙!

回答

0

轉到MyInvocation對象以查找腳本的路徑。

$this_dir = [io.path]::GetDirectoryName($MyInvocation.MyCommand.Path) 
$this_dir 

$dropbox = Get-Content -Path "$([io.path]::GetDirectoryName($MyInvocation.MyCommand.Path))\config.bat" ` 
      | ? { $_ -match "Dropbox_Path=\s*"} ` 
      | select -First 1 ` 
      | % { ($_ -split "=", 2)[1] } 

$dropbox 

更新:基於後續的答案,特別是mklement0,這裏是一個修改後的答案。

對於PowerShell中的所有版本:

$scriptdir = Split-Path -Path $MyInvocation.MyCommand.Path -Parent 
$dropbox = (Select-String -List ` 
    -Pattern ' Dropbox_Path=(.*)' ` 
    -Path "$scriptdir/config.bat").Matches[0].Groups[1].Value 

對於PowerShell的3。0+版本:

$dropbox = (Select-String -List ` 
    -Pattern ' Dropbox_Path=(.*)' ` 
    -Path $PSScriptRoot/config.bat).Matches[0].Groups[1].Value 
+0

我現在用MyInvocation得到這個錯誤......「異常調用 「GetDirectoryName」 與 「1」 的說法(S): 「路徑不是合法的形式」 在線:1 char:1 + $ dropbox = Get-Content -Path「$([io.path] :: GetDirectoryName($ MyInvocation.MyCom ... – Bearwires

+0

」 Get-Content:無法找到路徑'C:\ config.bat',因爲它不存在。「它似乎沒有爲配置文件位置定義正確的目錄,即使它位於相同的目錄中 – Bearwires

+0

什麼版本PowerShell你在運行嗎?這適用於PowerShell 5和6測試版3. – lit

0

此方法適用於像預期一樣:

#Grab Dropbox Path from config.bat and set $dropbox variable 

$dropbox = Get-Content $PSScriptRoot\config.bat ` 
     | ? { $_ -match "Dropbox_Path="} ` 
     | select -First 1 ` 
     | % { ($_ -split "=", 2)[1] } 

# Set other Variables using $dropbox 

$input_csv = "$dropbox\test\Test.csv" 
$master_csv = "$dropbox\test\Test-MASTER.csv" 
$output_file = "$dropbox\test\Test.txt" 
1

要引用運行腳本的位置(目錄)

  • PSv3 +:使用$PSScriptRoot$PSCommandPath指腳本的全部f ilename)。
  • PSv2-,除了在模塊:使用Split-Path $MyInvocation.MyCommand.Path$MyInvocation.MyCommand.Path指的是腳本的完整文件名)。

的慣用PSv3 +代碼的重新配製的問題:

$dropbox = (Select-String -List ' Dropbox_Path=(.*)' $PSScriptRoot/config.bat). 
      Matches[0].Groups[1].Value