Выберите файл на Import-Csv - PullRequest
0 голосов
/ 30 июня 2018

Приведенный ниже код является частью переключателя, и он работает нормально, но проблема в следующем: мне нужно изменить имя файла на 15 ... Можно ли изменить его так, чтобы при запуске он ожидал выбрать файл с помощью клавиши табуляции? Примерно так, когда вы пишете Import-Csv в консоли PowerShell и нажимаете Tab , он показывает все возможные пути и файлы.

$names = Import-Csv 15.csv -Header Givenname,Surname -Delimiter ";"
Write-Host "Rename your csv file to '15' and put it in same folder with this script" -ForegroundColor Cyan 
pause
foreach ($Name in $Names) {
    $FirstFilter = $Name.Givenname
    $SecondFilter = $Name.Surname
    Get-ADUser -Filter {GivenName -like $FirstFilter -and Surname -like $SecondFilter} |
        select Enabled, SamAccountName, DistinguishedName,
            @{n="ou";e={($_.DistinguishedName -split ",*..=")[2]}} |
        Export-Csv .\sam.csv -NoTypeInformation -Append
}

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Ниже приведен мой файл example.ps1, который я использую для написания одноразовых скриптов. В вашем случае я думаю, что вы можете получить то, что вы хотите с ним. Например, (без каламбура) вы можете вызвать этот скрипт, набрав

C:\PathToYourScripts\example.ps1 [tab]

, где [tab] обозначает нажатие клавиши табуляции. Включится Powershell intellisense и предложит автозаполнение имен файлов. Если ваш файл .csv отсутствует в текущем каталоге, вы можете легко использовать Powershell intellisense, чтобы найти его

C:\PathToYourScripts\example.ps1  C:\PathToCSvFiles[tab]

и powershell автоматически заполняется. Потенциальные пользователи могут заметить, что автозаполнение powershell - это НЕ ПОЛНАЯ сборщик файлов, но, похоже, это соответствует цели заданного вопроса. Вот образец.

<#
.NOTES
    this is an example script
.SYNOPSIS
    this is an example script
.DESCRIPTION
    this is an example script

.Example
    this is an example script
.LINK
    https://my/_git/GitDrive
#>
[CmdletBinding(SupportsShouldProcess=$True, ConfirmImpact="Low")]
param (
      [string] $fileName
)
Begin {
}

Process {
    if ($PSCmdlet.ShouldProcess("Simulated execution to process $($fileName):  Omit -Whatif to process ")) {
       Write-Information -Message "Processing $fileName" -InformationAction Continue
    }
}

End {
}

Если вы хотите получить справку по автозаполнению для нескольких параметров, просто введите имя (имена) параметров и нажимайте [tab] после каждого. Обратите внимание, что если оставить параметры пустыми, сценарий не будет нарушен, но вы можете либо расширить его, чтобы отметить требуемые параметры, либо просто потерпеть неудачу с полезным сообщением. Это кажется немного за пределами первоначального вопроса, поэтому я остановлюсь здесь.

0 голосов
/ 01 июля 2018

Самое простое решение - заставить ваш скрипт принять целевой файл в качестве аргумента , объявив параметр :

param(
  # Declare a mandatory parameter to which the file path of the CSV
  # file to import must be passed as an argument on invocation.
  [Parameter(Mandatory)]
  [string] $FilePath
)

$names = Import-Csv $FilePath -Header Givenname,Surname -Delimiter ";"
foreach ($Name in $Names) {
    $FirstFilter = $Name.Givenname
    $SecondFilter = $Name.Surname
    Get-ADUser -Filter {GivenName -like $FirstFilter -and Surname -like $SecondFilter} |
        select Enabled, SamAccountName, DistinguishedName,
            @{n="ou";e={($_.DistinguishedName -split ",*..=")[2]}} |
        Export-Csv .\sam.csv -NoTypeInformation -Append
}

Если вы вызовете свой скрипт без пути к файлу, вам будет предложено для него; давайте предположим, что ваш скрипт находится в текущем каталоге. и его зовут someScript.ps1:

./someScript    # invocation with no argument prompts for a value for $FilePath

К сожалению, такой автоматический запрос не удобен для пользователя и предлагает без завершения табуляции .

Тем не менее, в командной строке Завершение вкладки PowerShell по умолчанию завершает имена файлов и каталогов в текущем местоположении , так что

./someScript <press tab here>

циклически просматривает все файлы и каталоги в текущей папке.

Вы можете даже ввести выражение подстановочного знака и завершить табуляцией , что , , если вы не знаете полное имя файла или не хотите вводить его полностью:

./someScript *.csv<press tab here>

Это будет циклически перебирать все файлы *.csv в текущем каталоге. только.

Если вы хотите пойти еще дальше и настроить завершение вкладки , чтобы циклически проходить только по *.csv файлам , вы можете использовать атрибут [ArgumentCompleter({ ... })] ( PSv5 +):

param(
  [Parameter(Mandatory)]
  # Implement custom tab-completion based on only the *.csv files in the current dir.  
  [ArgumentCompleter({
    param($cmd, $param, $wordToComplete)
    Get-ChildItem -Name "$wordToComplete*.csv"
  })]
  [string] $FilePath
)

# ...

Теперь

./someScript <tab>

будет циклически перемещаться только по файлам *.csv в текущем каталоге, если таковые имеются.

Примечание. По-видимому, завершение табуляции аргумента empty без завершений-кандидатов (в данном случае без *.csv файлов) возвращается к завершению файла и имени каталога по умолчанию.

Аналогично,

./someScript 1<tab>

будет циклически перемещаться только по файлам *.csv в текущем каталоге, имя которого начинается с 1, если есть.


В качестве альтернативы использованию атрибута как части определения скрипта / функции, вы можете использовать PSv5 + Register-ArgumentCompleter командлет , чтобы присоединять дополнения табуляции к параметрам any команда , т.е. включая уже существующие.


В PSv4- у вас есть два (громоздких) варианта завершения пользовательской вкладки:

  • Использовать динамический параметр с динамически созданным атрибутом [ValidateSet()] - см. Ссылку в Ответ Рохина Сидхарта .

  • Настройте функцию tabexpansion2 (PSv3, PSv4) / tabexpansion (PSv1, PSv2), но убедитесь, что случайно не заменили существующую функциональность.

0 голосов
/ 30 июня 2018

Итак, вы хотите Intellisense в вашем скрипте. Амбициозный ход. Большинство людей согласились бы на file browser dialog box. В любом случае, мне придется отослать вас к более умным людям, чем я. Я думал, что атрибут ValidateSet будет служить вашей цели, но я понял, что традиционного блока param недостаточно. Итак, я посмотрел DynamicParams и вот что я нашел. Это должно работать для вас.

https://blogs.technet.microsoft.com/pstips/2014/06/09/dynamic-validateset-in-a-dynamic-parameter/

...