2015-12-19 2 views
0

Я хотел создать небольшой скрипт для поиска и замены нескольких строк в файле (используя комбинацию пакетной и PowerShell). Файлы всегда разные, поэтому мне всегда нужно зайти в пакет и изменить имя файла Get-Content и Out-File. Теперь я добавил приглашение ввести имя файла, и я даю это параметру, поэтому я мог бы как-то найти и отредактировать $filename.txt, например.Найти файл (получить контент) с переменной в имени файла

Здесь нормальный код PowerShell с заменой только одну строку (я интегрировать это в один пакетный файл позже снова):

$filename = Read-Host -Prompt 'Input filename' 
(gc $filename.txt) -replace 'foo', 'bar' | Out-File $filename.txt 

Поскольку этот скрипт лежит в той же папке, как файлы которыми я не понадобится путь.

Я также узнал, что gc не может читать переменные, что является именно моей проблемой здесь: я получаю код ошибки, который аргумент не может быть привязан к «пути», потому что это NULL.

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

+0

Я не понимаю почему вам нужны как пакетные, так и PowerShell. Если вы работаете в PowerShell, я думаю, вам будет лучше всего отбросить пакет. Если вы хотите работать с пакетом, вы можете рассмотреть мою [JREPL.BAT гибридную JScript/пакетную утилиту] (http://www.dostips.com/forum/viewtopic.php?t=6044). Вы можете использовать SET/P для запроса значения для переменной FileName. Тогда вы могли бы просто использовать 'call jrepl" foo "" bar "/ L/F '% FileName%"/O -' – dbenham

+0

Я думаю, что я уже нашел эту партию, но я очень смущался со всем содержанием ха-ха, d Фактически просто нужно добавить эту часть в самом конце? Я знал об этом параметре/P, но я попытался использовать это вместе с powershell в одной партии, и это не сработало. Powershell, потому что люди продолжали говорить: поскольку powershell prefixed скорее используйте это вместо пакета. Может быть, потому что, как и в вашей партии, мне нужно много кодирования для создания пакетной работы так же просто, как powershell. Я хотел интегрировать его в пакетном режиме, чтобы друзья могли его использовать. – Shoru

ответ

1

PowerShell позволяет использовать строки из одного слова или переменную, не помещая их котировки, поэтому следующие два оператора будут работать:

Get-Content foo.txt 
Get-Content $filename 

Однако, если вы хотите использовать аргумент, который сконструированный переменной и строка, которую вы должны поместить выражение в двойных кавычках:

Get-Content "$filename.txt" 

или использовать подвыражения для конкатенации переменных и строк:

Get-Content ($filename + '.txt') 

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

$filename = Read-Host -Prompt 'Input filename' 
$filename += '.txt' 
(Get-Content $filename) -replace 'foo', 'bar' | Set-Content $filename 
+0

Файл Powershell (рабочий): '$ filename = Read-Host -Prompt 'Input filename' (gc "$ filename.c4d") -replace 'foo', 'bar' | Set-Content "$ filename.c4d "' Пакетный файл с пакетом Powershell: @ECHO OFF powershell -Command "$ filename = Read-Host -Prompt 'Input filename'; (gc "$ filename.c4d") -replace 'foo', 'bar' | Set-Content "$ filename.c4d" ' Также: задано ли задание? Я заметил, что Out-File kinda сломал мой файл (.c4d), чтобы программа больше не могла его читать. – Shoru

+0

@Shoru Просто отпустите командный файл и запустите сценарий PowerShell. Сначала запустите 'Set-ExecutionPolicy RemoteSigned', если вы еще этого не сделали. Нет смысла (и, как вы можете видеть, подвергнуть ошибкам) ​​использовать пакет в качестве оболочки для PowerShell. Что касается 'Set-Content': он не является« более точным », он просто использует ASCII в качестве кодировки по умолчанию, тогда как« Out-File »использует Unicode (что, вероятно, является причиной того, что ваша программа не могла прочитать файл). –

+0

Мой первый комментарий не был отправлен по какой-то причине: '$ filename + = '.txt'' работает как шарм даже внутри партии! Спасибо за это. Мне было интересно только, почему он не будет работать с двойными кавычками, так как тот же код. И для ваших советов в первом посте: раньше я пытался '$ filename + = '.txt'' раньше, но я думаю, что забыл одинарные кавычки, так что это не сработало. :) И нормально, я действительно не думал или не рассматривал различия в кодировке ASCII и Unicode. – Shoru

Смежные вопросы