#powershell
#powershell
Вопрос:
Работает следующий код. Представьте, что переменная $Datfilecontents считывается из файла в моем основном скрипте перед передачей дальше. Скрипт должен попробовать каждую часть массива в UNC примерно так
\1404397769LDMS_MASTER_SHARE \SAO-LDMSLDMS_MASTER_SHARE
в приведенном ниже сценарии цикл for each видит как 1404397769, так и SAO-LDMS и пробует оба.
В основном скрипте, где $DatFileContents считывается из файла .dat (значение такое же, что и при предварительном отображении, все в порядке), проблема в том, что когда в цикле происходит вот что..
\1404397769LDMS_MASTER_SHARE передается первым, как и должно быть …. затем \SAO-LDMS
почему последняя часть $NetworkPath теряется в цикле?
единственное отличие в основном скрипте, над которым я работаю, заключается в том, что $ Datfilecontents был считан из файла, поэтому, пока данные совпадают, он должен работать? я не понимаю, как теряется переменная, которой даже нет в массиве?
Я что-то здесь упускаю? Приветствуется любая помощь.
$Datfilecontents = "1404397769;SAO-LDMS"
echo $1 "Before the split"
$1 = $DatFileContents.split(";");
echo $1 "after the split"
[array]::Reverse($1)
echo $1 "after the reverse"
Do
{
Foreach ($i in $1)
{
[String]$i
$net = new-object -ComObject WScript.Network
[String]$NetworkPath = "\$iLDMS_MASTER_SHARE"
$NetworkPath
Write-Host $NetworkPath "THIS IS THE PATH"
Try
{
$net.MapNetworkDrive("M:", $NetworkPath, $false, "domainuser", "password")
echo "Mapping Drive M to Preferred Server"}
Catch
{echo "Failed to Map Drive M to Preferred Server"
}
}
until (Test-Path "M:LDMS BUILD")
This is the output from the main script.
\1404398737LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
\SAO-LDMS THIS IS THE PATH
Failed to Map Drive M to Preferred Server
Как вы можете видеть, второй проход не показывает общий ресурс? итак, если не удается сопоставить диск. Однако переменная share должна быть действительной, поскольку она помещает ее после первого прохождения?
The full output from the code above.
Before the split
1404397769
SAO-LDMS
after the split
SAO-LDMS
1404397769
after the reverse
SAO-LDMS
\SAO-LDMSLDMS_MASTER_SHARE
\SAO-LDMSLDMS_MASTER_SHARE THIS IS THE PATH
Mapping Drive M to Preferred Server
1404397769
\1404397769LDMS_MASTER_SHARE
\1404397769LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
Полный вывод из основного скрипта. вы можете увидеть, что значения присутствуют, прежде чем он попытается их передать. Но это удаляет общий ресурс с первого прохода?
Before the split
1404401722
SAO-LDMS
after the split
SAO-LDMS
1404401722
after the reverse
SAO-LDMS
\SAO-LDMS
\SAO-LDMS THIS IS THE PATH
Failed to Map Drive M to Preferred Server
1404401722
\1404401722LDMS_MASTER_SHARE
\1404401722LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
Хорошо, это основной скрипт — я действительно не вижу разницы.
$DatFileLoc = "c:Program Files (x86)LANDeskLDClientsdmcache$DatFile";
Write-Host $DatFileLoc
$DatFileLoc
Write-Host "Preferred Server File found at $DatFileLoc";
Write-Host "Getting File Contents";
$DatFileContents = Get-Content $DatFileLoc
Write-Host $DatFileContents
$DatFileContents = $DatFileContents -replace "?", ";";
Write-Host $DatFileContents
echo $1 "Before the split"
$1 = $DatFileContents.split(";");
echo $1 "after the split"
[array]::Reverse($1)
echo $1 "after the reverse"
Do
{
Foreach ($i in $1)
{
[String]$i
$net = new-object -ComObject WScript.Network
[String]$NetworkPath = "\$iLDMS_MASTER_SHARE"
$NetworkPath
Write-Host $NetworkPath "THIS IS THE PATH"
Try
{
$net.MapNetworkDrive("M:", $NetworkPath, $false, "domainuser", "password")
echo "Mapping Drive M to Preferred Server"}
Catch
{echo "Failed to Map Drive M to Preferred Server" }
}
}
until (Test-Path "M:LDMS BUILD")
И вывод из этого…
c:Program Files (x86)LANDeskLDClientsdmcachepreferredservers.dat
Preferred Server File found at c:Program Files (x86)LANDeskLDClientsdmcachepreferredservers.dat
Getting File Contents
1404403455?SAO-LDMS
1404403455;SAO-LDMS
Before the split
1404403455
SAO-LDMS
after the split
SAO-LDMS
1404403455
after the reverse
SAO-LDMS
\SAO-LDMS
\SAO-LDMS THIS IS THE PATH
Failed to Map Drive M to Preferred Server
1404403455
\1404403455LDMS_MASTER_SHARE
\1404403455LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
Комментарии:
1. Я скопировал ваш скрипт, закомментировал строки цикла Try / Catch и Do / Until, и у меня скрипт работает нормально. Вы, должно быть, что-то упускаете.
2. Опубликованный мной код действительно работает нормально. тот же код в основном скрипте этого не делает — однако есть одно отличие — $Datfilecontents не назначается явно — он поступает из текстового файла. однако он не должен игнорировать общий ресурс — это даже не часть массива? это действительно сбивает меня с толку
3. показаны выходные данные обоих сценариев — вы можете видеть, что общий ресурс удаляется при первом прохождении цикла — я понятия не имею, почему?
4. Я изменил свой на
$Datfilecontents = GC test.txt
и получаю те же результаты, что и раньше, так что проблема не в чтении из файла. Что-то еще отличается между этим и вашим основным скриптом.5. я просмотрю еще раз, спасибо — но что заставило бы цикл игнорировать последнюю часть только один раз? уверяю вас, я ищу разницу! я просто не могу этого видеть.
Ответ №1:
Я сохранил ваш файл, изменил путь к своей папке загрузки (имя пользователя изменено для моей безопасности). Это код, который я запустил из своего ISE и консоли:
$DatFileContents = Get-Content "C:UsersTMTechDownloadspreferredservers.txt";
$DatFileContents = $DatFileContents -replace "?", ";";
echo $DatFileContents "Before the split"
$1 = $DatFileContents.split(";");
echo $1 "after the split"
[array]::Reverse($1)
echo $1 "after the reverse"
Do
{
Foreach ($i in $1)
{
[String]$i
$net = new-object -ComObject WScript.Network
[String]$NetworkPath = "\$iLDMS_MASTER_SHARE"
$NetworkPath
Write-Host $NetworkPath "THIS IS THE PATH"
Try
{
$net.MapNetworkDrive("M:", $NetworkPath, $false, "domainuser", "password")
echo "Mapping Drive M to Preferred Server"}
Catch
{ echo "Failed to Map Drive M to Preferred Server" }
}
}
until (Test-Path "M:LDMS BUILD")
Это то, что произошло, когда я запустил это:
1404418053;SAO-LDMS
Before the split
1404418053
SAO-LDMS
after the split
SAO-LDMS
1404418053
after the reverse
SAO-LDMS
\SAO-LDMS LDMS_MASTER_SHARE
\SAO-LDMS LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
1404418053
\1404418053LDMS_MASTER_SHARE
\1404418053LDMS_MASTER_SHARE THIS IS THE PATH
Failed to Map Drive M to Preferred Server
SAO-LDMS
\SAO-LDMS LDMS_MASTER_SHARE
\SAO-LDMS LDMS_MASTER_SHARE THIS IS THE PATH
Несколько замечаний:
- $ 1 не существует, когда вы пытаетесь повторить его в
echo $1 "Before the split"
вы, вероятно, имеете в виду эхо $datfilecontents. - Точка с запятой в концах строк в PowerShell не нужна.
- Вам не нужно объявлять
[String]$i
or[String]$NetworkPath
, поскольку они в любом случае будут строками. - Вы можете избавиться от всех
echo
там, эти строки будут отправлены на вывод по умолчанию. - Однако ни одна из этих вещей не остановила бы работу скрипта.
Жаль, что у вас нет репутации 20, мы могли бы просто перенести этот разговор на сервер чата Stack Overflow в приватной комнате, а не отвечать на комментарии туда-сюда.
Комментарии:
1. да, это немного запутанно с некоторыми вещами, которые я пробовал — я посмотрю, работает ли этот точный код здесь … спасибо
2. Результаты находятся в этом блоке кода. У меня все прошло нормально.
3. какая часть читает текстовый файл? можете ли вы опубликовать рабочий код — с помощью read the file — тогда я смогу вставить его и исключить свою машину.. пришлите мне точный код, который работает, у меня такое чувство, что это связано с машиной, если это не удается здесь.
4. Спасибо @TheMadTechnician, это была моя машина.. мне пришлось убрать пробел после SAO-LDMS, но на другой машине это сработало… думаю, мне нужно перестроить мою машину, спасибо в любом случае