Я нашел этот источник https://blogs.technet.microsoft.com/heyscriptingguy/2011/03/01/proxy-functions-spice-up-your-powershell-core-cmdlets/ [ 119]
В этом случае ярлык / псевдоним для Select-String -First 10 сводится к следующему:
$metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Select-Object)
[System.Management.Automation.ProxyCommand]::Create($MetaData) | Out-File -FilePath prxyfunctions.psm1
Откройте файл модуля prxyfunctions.psm1 и оберните все содержимое в новый функция называется S10
function S10 {
[CmdletBinding(DefaultParameterSetName = 'DefaultParameter', HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=113387', RemotingCapability = 'None')]
param(
.ForwardHelpTargetName Microsoft.PowerShell.Utility\Select-Object
.ForwardHelpCategory Cmdlet
#>
}
Затем в разделе Begin {} добавьте одно утверждение $PSBoundParameters.Add('First','10')
, как показано ниже.
begin {
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
$PSBoundParameters['OutBuffer'] = 1
}
$PSBoundParameters.Add('First','10')
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Select-Object', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
}
catch {
throw
}
}
Вот и все. Сохраните файл, импортируйте модуль, введите короткую команду типа gci c:\|s10
и получите всего 10 результатов. Если вы действительно хотите, чтобы все было надежно, нужно больше кодирования. Если используется S10 -First 2
, вы получите хорошую ошибку.
РЕДАКТИРОВАТЬ в ответ на полезные комментарии @PetSerAl
Некоторые дальнейшие командлеты в конвейере могут быть не в состоянии обрабатывать функцию прокси, например Sort-Object. Сравните выходные данные этих двух строк
-join (20..1 | Select -First 10 | Sort)
11121314151617181920
-join (20..1 | S10 | Sort)
-join (20..1 | S10 -Wait | Sort)
11121314151617181920
Это можно обойти, используя параметр -Wait в командной строке. Или закодируйте параметр Wait в прокси-функции $PSBoundParameters.Add('Wait',$true)
При работе с большими коллекциями это вызывает сожаление, поскольку отключает функцию Select-Object, которая останавливает конвейер после элементов x, что приводит к большей обработке и более длительному ожиданию.
iBATIS ScriptRunner имеет a setDelimiter(String, boolean)
метод. Это позволяет Вам иметь строку кроме""; быть разделителем между SQL-операторами.
В Вашем сценарии SQL Oracle разделите операторы с "/" (наклонная черта).
В Вашем коде Java, прежде, чем звонить runScript
сделайте a setDelimter("/", false)
который даст ScriptRunner команду распознавать "/" как разделитель операторов.
sqlplus: да Вы можете. Я выполняю sqlplus из Xemacs (редактор) все время. Так, можно выполнить sqlplus в интерпретируемом режиме и затем обеспечить, он управляет, и считайте вывод также.
Другой пути должен загрузить свободный основанный на Java инструмент разработчика SQL от оракула (http://www.oracle.com/technology/software/products/sql/index.html). это идет с утилитой sqlcli.bat, которая является оберткой по программе Java. Вы могли бы хотеть использовать эту утилиту командной строки, чтобы сделать Вашу работу.
сводка, я попытался бы выполнить sqlplus в фоновом режиме и обеспечил бы, это вводится, и чтение его вывода (как emacs делает).
Если Вы хотите записать Вашему собственному бегуну сценария, можно использовать JDBC's Spring SimpleJdbcTemplate (http://static.springframework.org/spring/docs/2.0.x/reference/jdbc.html).
Можно, конечно, загрузить сценарии, поскольку Вы были бы любой ресурс в Spring также.
Вы видите реализации других людей. Посмотрите этот ресурс: "SQL-клиенты с открытым исходным кодом в Java" http://java-source.net/open-source/sql-clients
Используйте следующее решение для справки, я пробовал и тестировал, и оно успешно работает.
private static String script_location = "";
private static String file_extension = ".sql";
private static ProcessBuilder processBuilder =null;
public static void main(String[] args) {
try {
File file = new File("C:/Script_folder");
File [] list_files= file.listFiles(new FileFilter() {
public boolean accept(File f) {
if (f.getName().toLowerCase().endsWith(file_extension))
return true;
return false;
}
});
for (int i = 0; i<list_files.length;i++){
script_location = "@" + list_files[i].getAbsolutePath();//ORACLE
processBuilder = new ProcessBuilder("sqlplus", "UserName/Password@database_name", script_location); //ORACLE
//script_location = "-i" + list_files[i].getAbsolutePath();
// processBuilder = new ProcessBuilder("sqlplus", "-Udeep-Pdumbhead-Spc-de-deep\\sqlexpress-de_com",script_location);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String currentLine = null;
while ((currentLine = in.readLine()) != null) {
System.out.println(" " + currentLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
Используйте этот фрагмент кода, попробуйте и запустите.
Спасибо пользователю, указавшему решение по ссылке ниже:
http://forums.sun.com/thread.jspa?threadID=5413026
С уважением | Nitin