Arquivos abertos do Powershell Script em computador e local

1

Eu não gosto nem um pouco do Microsoft Notepad. Eu prefiro usar notepad ++, mas desde que não é construído, não é fácil de usar a partir de uma linha de comando. Eu estou escrevendo um script de powershell que pode ajudar, aqui está o que eu tenho até agora:

Function Read ([string] $file)
{
$currentPath = (get-location).Path
cd "C:\program Files (x86)\Notepad++\"
.\notepad++.exe $file
cd $currentPath
}

O problema é que eu tenho que digitar o caminho completo toda vez. Na maioria das vezes eu estou no local que eu quero ler o arquivo, então seria bom poder chamar a função como:

read .\docu.txt

em vez de:     leia C: \ users \ user \ desktop \ docu.txt Eu estava pensando em algo como:

$fullPath = '$currentPath\$file'
.\notepad++.exe $fullPath

mas, se eu digitar o caminho inteiro, ele não funcionará mais, e isso não funciona de qualquer forma, porque seria como "C: \ users \ user \ documents. \ docu.txt" Também não manipula caminhos UNC. Quando eu seleciono o get-location de lá, parece que

Microsoft.Powershell.Core\FileSystem::\server\drive

e não consigo fazer isso funcionar.

    
por Jacob Smart 13.08.2013 / 18:56

2 respostas

4

Este seria um ótimo momento para usar o Regex. Há alguns problemas aqui, então vamos trabalhar com eles de cima para baixo. Primeiro, você precisa ser capaz de lidar com caminhos de rede. Faça isso adicionando o seguinte ao início do seu script para eliminar toda essa porcaria extra no caminho

$UNCPath = $pwd.ProviderPath

Isso fornecerá apenas a unidade \\ network \.

Agora, para lidar com as diferentes maneiras pelas quais você deseja enviar informações no parâmetro $ file, use expressões regulares para inspecionar o que você enviou.

$first = $file -match "\.\" #does file contain .\ ?
$second = $file -match "\"  #does file contain \ ?
if($first -eq $true)
{ #for instances when you sent in .\filename.txt
$subFile = $file.Substring(2) #Eliminate the .\ from the path
$completeFile = "$UNCPath\$subFile"
.\notepad++.exe $completedFile
}
else if($second -eq $true) #Contains \ but not .\ so you've sent the complete path
{
.\notepad++.exe $file   #easy when the full path is already sent
}
else
{  #You sent just the name of the document
$pathfile = $UNCPath + "\" + $file   #we assume if you just sent the name, the file is 
.\notepad++.exe $pathfile            #located at your current location
}
cd $currentPath
}
    
por 13.08.2013 / 19:07
1

Eu acho que você está fazendo desse jeito mais difícil do que precisa ser. :)

1) O Notepad ++ irá carregar um arquivo baseado no argumento se ele tem um caminho ou não, baseado no sistema de caminhos padrão do Windows.

Portanto, Notepad++ file.txt abrirá file.txt se estiver na pasta local e Notepad++ c:\path\file.txt abrirá C:\path\file.txt , independentemente da pasta em que você estiver.

2) Basta adicionar sua pasta Notepad ++ ao Caminho do sistema e, em seguida, você pode simplesmente digitar "notepad ++ c: \ caminho \ arquivo.txt" no prompt de comando.

Se você quiser isso mais curto, crie um arquivo de lote na pasta Notepad ++, talvez chamado read.bat , e seu conteúdo seria simplesmente algo como:

Notepad++.exe %1 %2 %3 %4 %5

Isso deve permitir que você execute read file.txt e / ou read c:\pathto\file.txt .

    
por 13.08.2013 / 21:46