AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-1152506

bat_cmd's questions

Martin Hope
bat_cmd
Asked: 2023-02-27 11:13:07 +0800 CST

Esses arquivos bat/ps1 podem ser modificados para abrir uma pasta em um dispositivo MTP (meus scripts bat/ps1 atuais já funcionam para copiar arquivos mp4)

  • 5

Estou usando o seguinte .ps1script e .batarquivo para copiar arquivos MP4 de uma pasta no meu telefone que é um dispositivo MTP sem letra de unidade (daí a necessidade de usar o Powershell).

Quero modificar o script do Powershell e o arquivo bat para que ele não copie os arquivos MP4 e, em vez disso, apenas abra a pasta onde estão os arquivos MP4.

Aqui está o script do Powershell, chamado CFD.ps1:

param([string]$deviceName,[string]$deviceFolder,[string]$targetFolder,[string]$filter='(.jpg)|(.mp4)$')
 
function Get-ShellProxy
{
    if( -not $global:ShellProxy)
    {
        $global:ShellProxy = new-object -com Shell.Application
    }
    $global:ShellProxy
}
 
function Get-Device
{
    param($deviceName)
    $shell = Get-ShellProxy
    # 17 (0x11) = ssfDRIVES from the ShellSpecialFolderConstants (https://msdn.microsoft.com/en-us/library/windows/desktop/bb774096(v=vs.85).aspx)
    # => "My Computer" — the virtual folder that contains everything on the local computer: storage devices, printers, and Control Panel.
    # This folder can also contain mapped network drives.
    $shellItem = $shell.NameSpace(17).self
    $device = $shellItem.GetFolder.items() | where { $_.name -eq $deviceName }
    return $device
}
 
function Get-SubFolder
{
    param($parent,[string]$path)
    $pathParts = @( $path.Split([system.io.path]::DirectorySeparatorChar) )
    $current = $parent
    foreach ($pathPart in $pathParts)
    {
        if ($pathPart)
        {
            $current = $current.GetFolder.items() | where { $_.Name -eq $pathPart }
        }
    }
    return $current
}
 
$deviceFolderPath = $deviceFolder
$destinationFolderPath = $targetFolder
# Optionally add additional sub-folders to the destination path, such as one based on date
 
$device = Get-Device -deviceName $deviceName
$folder = Get-SubFolder -parent $device -path $deviceFolderPath
 
$items = @( $folder.GetFolder.items() | where { $_.Name -match $filter } )
if ($items)
{
    $totalItems = $items.count
    if ($totalItems -gt 0)
    {
        # If destination path doesn't exist, create it only if we have some items to move
        if (-not (test-path $destinationFolderPath) )
        {
            $created = new-item -itemtype directory -path $destinationFolderPath
        }
 
        Write-Verbose "Processing Path : $deviceName\$deviceFolderPath"
        Write-Verbose "Moving to : $destinationFolderPath"
 
        $shell = Get-ShellProxy
        $destinationFolder = $shell.Namespace($destinationFolderPath).self
        $count = 0;
        foreach ($item in $items)
        {
            $fileName = $item.Name
 
            ++$count
            $percent = [int](($count * 100) / $totalItems)
            Write-Progress -Activity "Processing Files in $deviceName\$deviceFolderPath" `
                -status "Processing File ${count} / ${totalItems} (${percent}%)" `
                -CurrentOperation $fileName `
                -PercentComplete $percent
 
            # Check the target file doesn't exist:
            $targetFilePath = join-path -path $destinationFolderPath -childPath $fileName
            if (test-path -path $targetFilePath)
            {
                write-error "Destination file exists - file not moved:`n`t$targetFilePath"
            }
            else
            {
                $destinationFolder.GetFolder.CopyHere($item)
                if (test-path -path $targetFilePath)
                {
                    # Optionally do something with the file, such as modify the name (e.g. removed device-added prefix, etc.)
                }
                else
                {
                    write-error "Failed to move file to destination:`n`t$targetFilePath"
                }
            }
        }
    }
}

Aqui está o .batarquivo...

cls
@echo off
color 0f
title Copy MP4 Files

:: Use Powershell to copy MP4 files. Requires Powershell script "CFD.ps1" next to this batch file.

:: --------------------------------------------------------------------------------------------------------------
:: Put your device name here inside the double quotes:
set DEVICE_NAME="Galaxy A3 (2017)"

:: Put your device folder path (the part after the device name in "This PC") here inside the double quotes:
set DEVICE_FOLDER_PATH="Card\DCIM\Camera"

:: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:: Copy MP4 files from Device
cls
@echo off
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0CFD.ps1' -deviceName '%DEVICE_NAME%' -deviceFolder '%DEVICE_FOLDER_PATH%' -targetFolder '%CD%' -filter '(.mp4)$'"

:: ------------------------------------------------------------------------------
exit

Se o arquivo de lote acima for executado e assumindo as 2 variáveis DEVICE_NAME​​e DEVICE_FOLDER_PATHtiver o nome e o caminho corretos do dispositivo, junto com o dispositivo sendo conectado e ligado, ele copia os arquivos MP4 para a pasta onde o arquivo bat foi executado. Os arquivos MP4 estão originalmente nesta pasta:

This PC\Galaxy A3 (2017)\Card\DCIM\Camera

Como isso funciona, você pensaria que não seria tão difícil alterar os arquivos bat e ps1 acima, para que eles apenas abram a pasta onde estão os arquivos mp4.

Estou pedindo ao Chat GPT há três dias seguidos para alterar meus 2 scripts, para que ele apenas abra a pasta no Windows Explorer e não tenha me dado uma resposta funcional depois de provavelmente mais de 50 tentativas!

Como o acima funciona para copiar arquivos MP4, não vejo por que seria um problema modificá-lo para que ele apenas abra a pasta em vez de copiar os arquivos MP4 dela, mas não consegui até agora.

Se alguém puder esclarecer como fazer isso, estará resolvendo algo que venho tentando resolver há horas!

windows
  • 1 respostas
  • 51 Views
Martin Hope
bat_cmd
Asked: 2023-02-12 07:01:26 +0800 CST

Dividir um comando do Powershell em várias linhas ao usar em um arquivo em lote?

  • 7

Este comando funciona para substituir instâncias de OldText1, OldText2e OldText3em um arquivo txt, por NewText1, NewText2e NewText3quando o comando está em uma linha em um arquivo em lote da seguinte forma:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) -replace 'OldText1', 'NewText1' -replace 'OldText2', 'NewText2' -replace 'OldText3', 'NewText3' | Set-Content $_.FullName}"

Se eu tentar usar o ^símbolo para dividir o comando (que normalmente funciona em um arquivo em lote), ele não funcionará. Por exemplo, isso não funciona, nada é substituído no arquivo txt:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) ^
-replace 'OldText1', 'NewText1' ^
-replace 'OldText2', 'NewText2' ^
-replace 'OldText3', 'NewText3' ^
| Set-Content $_.FullName}"

Usar backticks também não funciona (mas não funcionaria porque este não é um script PS1):

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) `
-replace 'OldText1', 'NewText1' `
-replace 'OldText2', 'NewText2' `
-replace 'OldText3', 'NewText3' `
| Set-Content $_.FullName}"

Tenho perguntado aquela coisa do bot de bate-papo a manhã toda e não consigo pensar em nada que funcione. Na metade do tempo, ele continua colocando o comando em uma linha novamente e estou apenas andando em círculos com ele.

É impossível fazer o que estou tentando fazer?

A razão pela qual quero dividir o comando em várias linhas é simplesmente porque quero ser capaz de ler o que está sendo substituído sem ter que olhar horizontalmente ao longo (o que eventualmente será) um comando massivo. Pretendo adicionar muito mais comandos de substituição do que este, mas não está funcionando nem para três comandos de substituição... ainda!

Agradeço antecipadamente a qualquer pessoa que possa saber por que isso não está funcionando.

windows
  • 1 respostas
  • 52 Views
Martin Hope
bat_cmd
Asked: 2022-06-06 02:20:58 +0800 CST

Para o loop não funcionar, quando precedido por "cd /d" (Windows 10, arquivo em lotes)

  • 5

Se eu executar isso em um arquivo de lote dentro da pasta de arquivos MP4, ele funciona para definir o último arquivo MP4 modificado como uma variável, para que possa ser reproduzido com o media player padrão:

:: Set last modified MP4 file in current folder, as a variable...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"

:: Play the file (opens in default media player)...
"%newest%"

Se eu tentar colocar o seguinte em um arquivo de lote fora da pasta de arquivos MP4, então cd /dfor ignorado pelo loop for, não está funcionando:

:: Change to directory containing MP4 files...
cd /d "C:\My Videos"

:: Set last modified MP4 file in "C:\My Videos", as a variable (not working)...
for /f "eol=: delims=" %%F in ('dir /B /O:D *.mp4') do @set "newest=%%F"

:: Copy the MP4 to current folder...
xcopy "%newest%" "%CD%" /i /r /v /k /f /c /h /y >nul 2>&1

:: Change back to current directory
cd /d "%CD%"

Como você pode ver, o comando for loop é exatamente o mesmo em cada exemplo. Funciona no primeiro, mas não no segundo.

Tentei colocar pauseentre cada comando para ver se aparece algum erro, nenhum aparece.

Eu tentei tirar as aspas duplas %CD%- não faz diferença.

Tentei colocar Setlocal EnableDelayedExpansionantes dos comandos, não faz nada.

Anteriormente, tentei especificar a pasta diretamente no loop FOR, adicionando /Sao comando DIR, mas isso copia o arquivo MP4 errado por algum motivo, onde a data modificada era uma data aleatória sem sentido, não era o último MP4 modificado. Esse comando ficou assim:

for /f "eol=: delims=" %%F in ('dir /B /S /O:D "C:\My Videos\*.mp4"') do @set "newest=%%F"

Isso define um MP4 como variável... mas não o correto!

Usando um arquivo de lote dentro da pasta de arquivos MP4, sei que sempre funciona dessa maneira.

Desde já agradeço a todos que puderem esclarecer por que isso não está funcionando.

windows command-line
  • 1 respostas
  • 183 Views
Martin Hope
bat_cmd
Asked: 2022-03-25 22:10:00 +0800 CST

Replicar o comportamento da GUI ao abrir uma janela do Explorer com linha de comando no Windows 10?

  • 5

Se eu clicar duas vezes em um atalho para uma pasta e abrir essa pasta, clicar duas vezes no mesmo atalho novamente, o Windows não abre uma segunda instância da pasta, ele ativa (ou maximiza) a pasta se ela já estiver aberta, o que é o comportamento que estou tentando replicar na linha de comando.

Eu posso executar isso em um arquivo bat: explorer "MyFolder"

Isso abre a pasta "MyFolder" que está ao lado do arquivo bat, mas se eu executar o arquivo bat novamente com "MyFolder" já aberto, ele abre outra instância da pasta.

explorer.exe quase não tem nenhuma opção para ele, então eu me perguntei se existe alguma outra solução alternativa ou chave secreta que não está documentada, então não importaria se o arquivo bat foi executado várias vezes, apenas uma instância de "MyFolder" seria abrir?

Talvez haja um pequeno programa de linha de comando que lide com esse problema, mas não sei de nada, por isso estou perguntando aqui.

Felicidades com antecedência.

EDIT: Depois de algumas brincadeiras, isso funciona, mas se a pasta já estiver maximizada, ela a minimiza. Ele funciona para abrir apenas uma instância embora ... start "" "MyFolder"

Acho que isso pode ser útil, mas é inconveniente ter a pasta minimizada se já estiver aberta e maximizada.

Eu poderia criar um atalho para a pasta e executá-lo na linha de comando com as propriedades definidas como "Executar maximizado", mas não quero que ele preencha a tela, o que "Executar maximizado" faria.

windows command-line
  • 1 respostas
  • 66 Views
Martin Hope
bat_cmd
Asked: 2022-03-11 15:25:41 +0800 CST

Comando Powershell (no arquivo em lote) para remover os últimos 3 caracteres (antes da extensão) do nome do arquivo?

  • 5

Eu tenho arquivos mp3 (com nomes de tamanhos diferentes) e quero remover os três últimos caracteres antes de ".mp3" para cada arquivo mp3 ao lado do arquivo de lote.

Por exemplo foobar043.mp3, precisa se tornarfoobar.mp3

Isso parece simples, mas tentei muitas maneiras de fazer isso (com o PowerShell em um arquivo em lotes) e tentei fazê-lo apenas com comandos em lote - usando respostas já aqui no SuperUser.

Meu último comando foi o mais próximo, mas também remove a extensão do arquivo. Isso é encurtado apenas para o próprio comando:

gci *.mp3 | rename-item -newname { $_.name.substring(0,$_.name.length-7) }

Agora, se houvesse apenas alguma maneira de manter ".mp3" no final (ou renomear o arquivo agora sem extensão de volta para .mp3 sem renomear pastas também!) estaria funcionando bem.

As pessoas costumam pedir para listar o que já foi tentado, mas essa pergunta acabaria dez vezes mais longa! Coloque desta forma, se você digitar "powershell remover os últimos caracteres do nome do arquivo" no Google, tentei quase tudo o que encontrei até agora.

Apenas alguns exemplos tentando as respostas aceitas (e votadas):

  • https://stackoverflow.com/questions/33255834/powershell-rename-filename-by-removing-the-last-few-characters
  • https://stackoverflow.com/questions/57202742/how-to-remove-last-x-number-of-character-from-file-name
  • https://stackoverflow.com/questions/29636714/remove-end-of-filename-using-powershell
  • https://stackoverflow.com/questions/10396769/powershell-remove-last-3-characters-from-file-name

(juntamente com respostas sobre spiceworks e reddit que não vou vincular caso não seja permitido aqui).

Desde já agradeço a quem souber como fazer isso mantendo a extensão do arquivo.

É difícil porque, normalmente, eu seria capaz de definir o nome do arquivo (sem extensão) como uma variável, mas como o PowerShell renomeará o arquivo, essa variável se tornará inútil.

windows command-line
  • 2 respostas
  • 2096 Views
Martin Hope
bat_cmd
Asked: 2021-12-08 09:11:46 +0800 CST

Excel aninhado "IF" retornando "FALSE", mas não consigo descobrir por que

  • 5

Eu quero fazer algo bem simples no Excel:

If Y13 is greater than 0% of X13 and less than 33% of X13, display "Strong".    
If Y13 is greater than 67% of X13 and less than 100% of X13, display "Weak".    
If Y13 is greater than 33% of X13 and less than 67% of X13, display "Medium".

Devo ter tentado 20 maneiras diferentes, tentando fazer *0.67para tentar enganá-lo para fazer a porcentagem de outra maneira, sem sucesso.

Isso não cria nenhum erro, mas aparece erroneamente FALSEna célula, quando Y13 é 9% de X13 (56/616), que deve cair na categoria "Forte":

=IF(AND(Y13>0%<33%)X13,"Strong",IF(AND(Y13>67%<100%)X13,"Weak",IF(AND(Y13>33%<67%)X13,"Medium")))

Em vez de dizer "Forte", está jogando o Excel padrão FALSEpor algum motivo.

Eu também tentei estes e nenhum funciona:

=IF(AND(Y13>0%<33%X13),"Strong",IF(AND(Y13>67%<100%X13),"Weak",IF(AND(Y13>33%<67%X13),"Medium")))

=IF(AND(Y13>0%,X13,<33%,X13),"Strong",IF(AND(Y13>67%,X13,<100%,X13),"Weak",IF(AND(Y13>33%,X13,<67%,X13),"Medium")))

=IF(AND(Y13>0%X13<33%X13),"Strong",IF(AND(Y13>67%X13<100%X13),"Weak",IF(AND(Y13>33%X13<67%X13),"Medium")))

Este é o que eu pensei que deveria funcionar, mas também não funcionou:

=IF(AND(Y13>0%<33%),X13,"Strong",IF(AND(Y13>67%<100%),X13,"Weak",IF(AND(Y13>33%<67%),X13,"Medium")))

Esse último cria o erro "Muitos argumentos", mas remover (algumas) vírgulas não o corrigiu.

Desde já agradeço a quem puder ver o que está dando errado.

microsoft-excel worksheet-function
  • 1 respostas
  • 25 Views
Martin Hope
bat_cmd
Asked: 2021-12-05 01:21:54 +0800 CST

Encurtar a fórmula "SE" do Excel?

  • 8

Esta fórmula funciona, mas é enorme:

=IF(X3=B2,K2,IF(X3=B3,K3,IF(X3=B4,K4,IF(X3=B5,K5,IF(X3=B6,K6,IF(X3=B7,K7,IF(X3=B8,K8,IF(X3=B9,K9,IF(X3=B10,K10,IF(X3=B11,K11,IF(X3=B12,K12,IF(X3=B13,K13,IF(X3=B14,K14,IF(X3=B15,K15,IF(X3=B16,K16,IF(X3=B17,K17,IF(X3=B18,K18,IF(X3=B19,K19,IF(X3=B20,K20,IF(X3=B21,K21))))))))))))))))))))

Aqui está o que está fazendo:

If X3 is the same as B2, show the contents of cell K2.
If X3 is the same as B3, show the contents of cell K3.
If X3 is the same as B4, show the contents of cell K4.
...etc etc etc all the way to...
If X3 is the same as B21, show the contents of cell K21.

Como B2:B21 é simplesmente uma coluna de células e K2:K21 também é apenas uma coluna de células, existe alguma maneira de encurtar a fórmula acima, para que não seja enorme?

Eu não sei como transformar isso em 2 intervalos de células B e células K.

Tentar algo assim não funciona: =IF(X3=B2:B21,K2:K21)

Porque dizer ao Excel para usar :é dizer para somar tudo, de B2 a B21 e K2 a K21. Gostaria de saber se há algum outro separador (não um :) que diz ao Excel para tratar cada célula individualmente em vez de adicioná-las?

Isso não funciona: =IF(X3=B2-B21,K2-K21)

Isso resulta em:#VALUE!

O problema é que, qualquer que seja o número da célula B, também deve ser correspondido com o número correspondente (horizontalmente) na célula K.

Obrigado antecipadamente a qualquer um que possa saber a resposta, que tenho certeza que é realmente simples se a funcionalidade existir no Excel.

microsoft-excel worksheet-function
  • 3 respostas
  • 562 Views
Martin Hope
bat_cmd
Asked: 2021-08-01 03:01:07 +0800 CST

Comando Powershell no arquivo de lote: Remova todas as linhas do arquivo de texto, exceto as linhas com "foo" e "bar"?

  • 2

Eu tenho um arquivo de texto com essas 3 linhas:

This line contains foo.
This line contains bar.
This line has neither.

Eu posso executar o comando abaixo em um arquivo ".bat" (ao lado do arquivo ".txt" acima) e ele remove todas as linhas do arquivo de texto, exceto as linhas que contêm "foo":

Powershell.exe -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -like '*foo*' }) | set-content $_.FullName}"

Executando que tenha o efeito pretendido, deixando apenas esta linha no arquivo de texto:

This line contains foo.

Agora o problema: E se eu quiser manter linhas que tenham "foo" e "bar" na linha?

Devo ter tentado provavelmente 40 ou 50 combinações diferentes até agora, colocando um caractere pipe: *foo*|*bar*, tirando os asteriscos foo|bar, colocando asteriscos apenas no início e no final: *foo|bar*, usando uma vírgula, não usando uma vírgula, usando um ponto e vírgula, não usar ponto e vírgula, duplicar o -likecomando com e sem $_ e muitas outras maneiras.

Nada funciona - em todas as tentativas até agora, acabei com o arquivo de texto com a mesma aparência, com as três linhas originais contendo foo (linha 1), bar (linha 2) e nenhum (linha 3).

Para ter certeza de que não estou editando o comando e cometendo um erro, estou periodicamente removendo minhas edições e executando o comando novamente para apenas tirar linhas sem "foo" na linha e funciona, ou apenas colo o comando novamente, teste-o novamente e comece a tentar editá-lo para incluir "bar", sem sucesso.

Eu já fiz essa pergunta recentemente, mas acho que minha redação do título não foi clara. Alguém tentou responder, mas todas as respostas que forneceram não funcionaram, pelo menos quando estou colocando o comando em um arquivo em lotes e executando-o ao lado do arquivo de texto, talvez esteja funcionando para eles, usando um método diferente para o que eu sou, eu não sei.

Observe que estou usando um comando powershell em um arquivo de lote! Não estou digitando em um console ou usando scripts ps1. Eu não preciso fazer nada disso, porque o primeiro comando que mencionei acima funciona para remover todas as linhas com "foo".

Obviamente, como isso funciona, o comando pode ser usado como base para adicionar, para que possa lidar com "foo" e "bar" em um único comando.

A menos, é claro, que isso seja 100% impossível - o que depois de cerca de 4 dias tentando 40 ou 50 variações diferentes no comando - é o que estou começando a suspeitar!

Por favor, se alguém responder isso, poste um comando de arquivo em lote como eu fiz acima. Por favor, não me diga para passar a usar scripts ps1 ou dar respostas que estão explicando o que digitar em uma janela do console.

O comando que postei acima simplesmente precisa de algum tipo de alteração para que "bar" possa ser adicionado a "foo", para que ele lide com mais de uma string de texto.

A razão pela qual isso é tão difícil parece ser porque se você executar um comando para remover todas as linhas, exceto aquelas com "foo", você já retirou as linhas com "bar". Eu suspeito que é por isso que ninguém chegou a uma solução de trabalho ainda e talvez simplesmente não haja uma.

Desde já agradeço a quem tiver uma resposta funcional. Normalmente, essas coisas são respondidas aqui muito rápido, ou eu continuo tentando maneiras diferentes e faço funcionar - mas não desta vez, isso é muito difícil por algum motivo.

windows command-line
  • 2 respostas
  • 599 Views
Martin Hope
bat_cmd
Asked: 2021-06-07 01:37:05 +0800 CST

Powershell - substitua o texto após o curinga, sem nada?

  • 6

Estou usando um comando do Powershell em um arquivo de lote do Windows para procurar uma string de texto como esta: foo=1 (onde 1poderia haver qualquer coisa)

Eu sei que .*?funciona como um curinga no Powershell. O trecho abaixo não é o comando completo, coloquei apenas a parte relevante.

Estou tentando substituir toda a linha foo=1por nada, usando o curinga do Powershell .*?para o 1seguinte:

-replace 'foo=.*?', ''

O problema é que, em vez de ficar com uma linha em branco, ainda fico com o final=1

Não sei por que o curinga não está sendo substituído por nada conforme o comando na caixa de código acima.

Agradeço antecipadamente a qualquer resposta que lance alguma luz sobre isso.

windows command-line
  • 2 respostas
  • 5914 Views
Martin Hope
bat_cmd
Asked: 2021-05-04 22:26:07 +0800 CST

Comandos do Powershell em cadeia no arquivo de lote? (Janelas)

  • 5

Estou executando comandos do Powershell em um arquivo em lotes para substituir o texto.

Isso funciona, mas executa uma instância do Powershell toda vez que substitui algo:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | Set-Content $_.FullName}"

:: Replace foo2 with bar2
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2' | Set-Content $_.FullName}"

:: Replace foo3 with bar3
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

Existe uma maneira de encadear os três comandos adicionando algo como & ^no final de uma linha, no meio do segundo comando?

Quero manter cada -replacecomando em uma linha separada porque tenho mais de 100 comandos para encadear.

Já tentei fazer desta forma e não funciona:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | & ^

:: Replace foo2 with bar2
 | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2' | & ^

:: Replace foo3 with bar3
 | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

Eu também tentei o acima sem o &personagem.

Eu tentei remover ForEach-Object {(Get-Content $_)das linhas do meio e da última, não funciona.

É a :: commentscausa de um problema?

Eu pensei que como este é o comando do Powershell entre aspas duplas, vou tentar desta maneira, onde o tique-taque e o ponto e vírgula no final de cada linha devem dizer ao Powershell para continuar o comando e tratar a próxima linha como parte do mesmo comando:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1';`

# Replace foo2 with bar2
 | ForEach-Object {(Get-Content $_) -replace 'foo2', 'bar2';`

# Replace foo3 with bar3
 | ForEach-Object {(Get-Content $_) -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

(não funciona)

Eu tentei tirar alguns dos comandos do Powershell:

:: Replace foo1 with bar1
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1';`

# Replace foo2 with bar2
'foo2', 'bar2';`

# Replace foo3 with bar3
'foo3', 'bar3' | Set-Content $_.FullName}"

(Não funciona).

Eu tentei tirar os comentários completamente, não funciona.

Eu tentei adicionar de volta -replaceao início de cada linha, não funciona.

Isso não funciona tentando colocá-lo em uma linha:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1'; -replace 'foo2', 'bar2'; -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

Colocar um tubo em vez de um ponto e vírgula também não funciona:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'foo1', 'bar1' | -replace 'foo2', 'bar2' | -replace 'foo3', 'bar3' | Set-Content $_.FullName}"

Provavelmente existem dezenas de combinações diferentes tentando fazer isso funcionar, mas não tenho ideia de qual é o caminho certo e estou sem ideias.

Os comandos não estão funcionando quando encadeados com um ;semelhante descrito em outras respostas.

Felicidades.

windows command-line
  • 2 respostas
  • 758 Views
Martin Hope
bat_cmd
Asked: 2021-05-02 05:13:37 +0800 CST

Mantenha apenas linhas em arquivos txt que contenham uma determinada palavra/caractere (Powershell) (arquivo de lote do Windows)

  • 5

Quero manter apenas as linhas que contêm a palavra examplee remover todas as outras linhas.

Eu pensei que isso funcionaria, mas faz o oposto do que estou tentando fazer:

PowerShell -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -notlike '*example*' }) | set-content $_.FullName}"

Eu quero terminar com um comando que transforma isso:

This line contains example.
This line does not.

Nisso:

This line contains example.

Isso parece que deve ser simples, mas não consigo encontrar nenhuma resposta para isso. As soluções que encontrei não funcionaram, ou fazem o oposto, ou incluem um monte de outras coisas que não preciso fazer.

Felicidades.

windows command-line
  • 1 respostas
  • 48 Views
Martin Hope
bat_cmd
Asked: 2021-04-21 20:08:13 +0800 CST

Confuso sobre o rótulo goto (arquivo em lote) Windows

  • 5

Se eu usar esses comandos dessa maneira, ele faz o que deveria:

Se foo foi definido anteriormente como uma coisa ou outra, ele pula parafoobar_menu

Se fooanteriormente não foi definido como (o mesmo) uma coisa ou outra, ele pula paraanother_menu

rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu

rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu

Eis por que está me confundindo - se eu trocá-los como mostrado abaixo, não funciona corretamente, vai para o rótulo errado, mas por quê?

rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu

rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu

Por que essas duas coisas não estão fazendo a mesma coisa?

Isso é porque não estou colocando as partes goto entre colchetes?

Eu o tenho funcionando (a primeira maneira), mas essa não é a mesma ordem em que meus menus entram e eu só queria que tudo funcionasse da maneira que está definido no segundo exemplo (não funcional) acima.

Felicidades.

EDITAR:

Estes são os comandos reais. Quando colocado dessa maneira, embora aninhado, ele ainda vai para o rótulo, choose_audio_sample_ratemesmo que opus ou libopus esteja definido na variável.

if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate
if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus

Na verdade, a versão trocada também não funciona, também vai para choose_audio_sample_ratemesmo que opus ou libopus esteja definido na variável.

if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus
if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate

Estou virando um lunático aqui lol, OK, vai funcionar (e passar direto para o menu não-opus) se eu usar apenas isso:

if "%audio_codec%"=="libopus" (goto :choose_audio_sample_rate_opus)
if "%audio_codec%"=="opus" (goto :choose_audio_sample_rate_opus)

Se for libopus, vai para o rótulo certo. Se não for libopus, a próxima linha é processada e se for opus, vai para o rótulo correto.

Se foi além disso, nem libopus nem opus e segue para o menu geral.

windows batch
  • 3 respostas
  • 141 Views
Martin Hope
bat_cmd
Asked: 2021-04-15 02:18:51 +0800 CST

Remover todo o espaço em branco à direita com powershell no arquivo de lote?

  • 7

Isso funciona para remover um espaço em branco das extremidades de todas as linhas em todos os arquivos txt ao lado do arquivo em lote em que é executado:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace ' $', '' | Set-Content $_.FullName}"

Existe uma maneira de modificar o acima para remover qualquer quantidade de espaço em branco (incluindo guias) das extremidades das linhas?

Eu só quero proteger contra a existência de dois ou mais espaços e/ou tabulações no final das linhas.

Eu estive procurando a manhã toda e tentando diferentes variações do acima, sem sucesso.

Felicidades.

powershell command-line
  • 1 respostas
  • 556 Views
Martin Hope
bat_cmd
Asked: 2021-04-13 08:19:21 +0800 CST

Escape barra invertida ao lado de aspas duplas no PowerShell falhando

  • 6

Estou executando o PowerShell em um arquivo em lotes para substituir caracteres e estou preso tentando substituir instâncias \"de ".

\por si só pode ser escapado fazendo\\

"por si só pode ser escapado fazendo""""

Eles funcionam, mas se houver uma barra invertida ao lado de aspas duplas, isso não funcionará:\\""""

É possível fazer isso, ainda usando o PowerShell em um arquivo em lotes?

powershell command-line
  • 1 respostas
  • 2293 Views
Martin Hope
bat_cmd
Asked: 2020-09-05 02:54:17 +0800 CST

Excluir uma pasta específica se estiver vazia, do arquivo em lote no Windows?

  • 7

Desejo excluir uma pasta chamada "NEW", mas somente se essa pasta estiver vazia.

Aqui está o que eu tentei:

if exist "NEW\*" goto finished
if not exist "NEW\*" goto remove_new

:remove_new
rd /s /q "NEW\"
goto finished

:finished
exit

O que foi dito acima parece estar levando em consideração que a pasta NOVA existe, então não a está excluindo?

windows batch
  • 3 respostas
  • 1463 Views
Martin Hope
bat_cmd
Asked: 2020-03-31 19:50:15 +0800 CST

O arquivo em lote com permissões elevadas não está funcionando?

  • 6

Depois de ver esta solução: Como executar o comando de arquivo em lote com permissões elevadas?

Eu coloquei isso em um arquivo de lote:

powershell -command "Start-Process cmd -ArgumentList '/c %CD% && elevated.bat' -Verb runas"

Ao lado desse arquivo, coloquei "elevated.bat" com este comando:

regedit /S reg_entries.reg

Depois de fazer isso, ele exibe um prompt do UAC para o Windows Command Processor, também conhecido como cmd.exe:

Caixa de diálogo UAC para cmd:

Estou definitivamente logado como administrador (confirmado em Painel de controle > Contas de usuário)

Estou preso agora!

Eu pensei que o objetivo do primeiro comando acima era parar este prompt do UAC?

windows-7 command-line
  • 1 respostas
  • 191 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve